1 equals(eq日)和==的不同
equals方法是java.lang.Object类的方法
有两种用法说明:
一、对于字符串变量来说,使用“==”和“equals()”方法比较字符串时,其比较方法不同。 1、“==”比较两个变量本身的值,即两个对象在内存中的首地址。 (java中,对象的首地址是它在内存中存放的起始地址,它后面的地址是用来存放它所包含的各个属性的地址,所以内存中会用多个内存块来存放对象的各个参数,而通过这个首地址就可以找到该对象,进而可以找到该对象的各个属性)
这个是他们的定义
前几天遇到一个奇葩的事情,同事说的,我刚开始以为是我菜,不知道这个
前几天同事不是写一个枚举吗
public enum DeliveryStatusEnum {
cancel(1,"取消"),
noPay(2,"待付款"),
noDelivery(3,"待提货"),
close(4,"已关闭"),
finish(5,"已完成"),
RefoundIng(7,"售后中"),
RefoundFinsh(8,"售后完成"),
fill(8,"填充状态");
public Integer code;
public String msg;
private DeliveryStatusEnum(Integer code, String msg) {
this.code = code;
this.msg = msg;
}
}
奇葩来了 他写一个
tradeCoreOrderServerRemoteFacade.orderNoSend(detailByDeliveryNo.getOrderNo()).equals(1)
我当场迷了,这个是什么,为什么可以这样,他回答,假设他传递是long,只有 Integer(应的解)才能==,这样可以比较2个数字的地址
那真实的情况是什么
public class Test11 {
public static void main(String[] args) {
Long j=1L;
Integer k=1;
int l=1;
long o=1;
long p=1L;
if (j==1){
System.out.println("1111111");
}
if (k == 1){
System.out.println("2222222222222222");
}
if (l==1){
System.out.println("333333333333");
}
if (o==1){
System.out.println("4444444444444444444444");
}
if (p==1){
System.out.println("5555555555555555555555555");
}
if (j.equals(1)){
System.out.println("66666666666666666666666666666");
}
if (j.equals("1")){
System.out.println("77777777777777777777");
}
if (k.equals("1")){
System.out.println("88888888888888888888888888");
}
if (k.equals(1)){
System.out.println("9999999999999999999999999999999999999");
}
}
}
测试一下 没有错误equals("1")和equals(1) 不会出现问题
看结果
1111111
2222222222222222
333333333333
4444444444444444444444
5555555555555555555555555
9999999999999999999999999999999999999
所有说,他说的不对
对于非字符串变量来说,"=="和"equals"方法的作用是相同的都是用来比较其,对象在堆内存的首地址,即用来比较两个引用变量是否指向同一个对象。 再测试一个小数
public class Test11 {
public static void main(String[] args) {
Double gs=0.98;
double kk=0.098;
Float jj=0.98f;
if (jj.equals("0.98")){
System.out.println("111111111111");
}
if (jj.equals(0.98)){
System.out.println("2222222222222222222222");
}
if (gs==0.98){
System.out.println("3333333333333");
}
}
}
2222222222222222222222
3333333333333
所有建议数字还是==,字符串才比较地址
至于为什么去看我以前写过的字符串源码分析
== 比较符也是比较指向的对象是否相同的也就是对象在对内存中的的首地址。
注意
对于基本类型的包装类型,比如Boolean、Character、Byte、Shot、Integer、Long、Float、Double等的引用变量,==是比较地址的,而equals是比较内容的。 大家要分清,不要说出来要别人感觉你比较搞笑,你以为正确,但是别人最后发现你乱七八糟说的
奇葩问题2
public class Test11 {
public static void main(String[] args) {
List<User> list=new ArrayList();
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i).getPassword());
}
for (User i:list) {
System.out.println(i.toString());
}
}
}
假设集合都没有值的时候不会出现问题的,但是 测试
@RestController
class UserCotroller111 {
@Autowired
private UserService userService;
@GetMapping("/cc")
public String getMap(){
return userService.select();
}
@GetMapping("/kk")
public String getkk(){
return userService.insert();
}
}
xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zhuzhumail.dao.Userdao">
<select id="select" parameterType="com.zhuzhumail.entity.User" resultType="com.zhuzhumail.entity.User">
SELECT * FROM `user`
</select>
<insert id="insert" parameterType="com.zhuzhumail.entity.User">
insert into `user`(`name`,password) values (#{name},#{password})
</insert>
<insert id="insertByBatch" parameterType="java.util.List">
INSERT INTO `user` VALUES
<foreach collection="list" item="item" index="index" separator=",">
(#{item.name},#{item.password})
</foreach>
</insert>
</mapper>
业务层
@Service
public class UserServiceimp implements UserService {
@Autowired
private Userdao userdao;
@Override
public String select() {
System.out.println("11111111111111");
List<User> list=new ArrayList();
for (int i = 0; i < list.size(); i++) {
userdao.insert(list.get(i));
}
return "成功";
}
@Override
public String insert() {
List<User> list=new ArrayList();
userdao.insertByBatch(list);
return "批量插入";
}
}
发现批量插入是有问题的 插入的时候记得数据什么字段必须存在,不能为空,你传递是null也是会出现问题的
@Data
public class User implements Serializable {
private Integer id;
private String name;
// private String password;
}
出现这种缺password也是会出现问题的 所有建议大家的插入在真实项目中进行手写,不要调用
这种的万能的 自己认为自己聪明都是会出现问题的
<insert id="insertByPrimaryKey" parameterType="com.rome.cstore.infrastructure.dataobject.RefundOrderinfo" useGeneratedKeys="true" keyProperty="id">
INSERT into cstore_refund_order_info
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="orderId!=null">
order_id
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="orderId!=null">
#{orderId}
</if>
</trim>
</insert>
这个跟更新的set一样会自动去调,但是最后一个不要加,
奇葩问题3
假设2张表进行相连有关系 ,但是
2种情况 连接条件是空和连接条件不存在
执行sql
SELECT * FROM staff sta INNER JOIN department de on sta.departmentid=de.departmentid
没有问题,我不知道为什么当时我同事出现这个问题 可能就是mysql版本高,出现问题
post的请求
@RequestParam(value = "deliveryCode") String deliveryCode也是可以使用这个的
还有记住集合的
可以进行判断 不适合进行删除,但是for不可以 可以实现一半判断不适合进行删除
public class Test11 {
public static void main(String[] args) {
List<User> list=new ArrayList();
Iterator<User> iterator = list.iterator();
while (iterator.hasNext()) {
User next = iterator.next();
if (next.getName().equals(":1")){
}
iterator.remove();
}
}
}
这个时候也是不会出现问题的
public class Test11 {
public static void main(String[] args) {
List<User> list=new ArrayList();
User uid=new User();
list.add(uid);
User uid1=new User();
list.add(uid1);
//根据下标进行删除
list.remove(1);
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}
}
填充值
public class Test11 {
public static void main(String[] args) {
List<User> list=new ArrayList();
User uid=new User();
list.add(uid);
User uid1=new User();
list.add(uid1);
list.add(3,uid1);
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}
}
假设集合下标是3前面不存在2就会出现问题 但是使用数组就不会出现这个问题
public class Test11 {
public static void main(String[] args) {
// List<User> list=new ArrayList();
// User uid=new User();
//
// list.add(uid);
User uid1=new User();
// list.add(uid1);
//
// list.add(3,uid1);
User [] uid2=new User[122];
uid2[9]=uid1;
for (int i = 0; i <10; i++) {
System.out.println(uid2[i]);
}
}
}
打印
null
null
null
null
null
null
null
null
null
User(id=null, name=null)
去除数组空值
public static KqAbsenceDutyVo[] deleteArrayNull(KqAbsenceDutyVo[] kqAbsenceDutyVos2) {
KqAbsenceDutyVo[] kqAbsenceDutyVos = kqAbsenceDutyVos2;
// 声明一个list
List<KqAbsenceDutyVo> list = new ArrayList<>(kqAbsenceDutyVos2.length);
for (KqAbsenceDutyVo str : kqAbsenceDutyVos) {
list.add(str);
}
// 删除空的值
while (list.remove(null)) ;
while (list.remove("")) ;
// 将list 转换成数组
KqAbsenceDutyVo[] list2 = (KqAbsenceDutyVo[]) list.toArray(new KqAbsenceDutyVo[]{new KqAbsenceDutyVo()});
// 返回删除空值后的数组
return list2;
}
项目经常用的时间工具类
@Slf4j
public class TimeUtils {
private static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
// 获得当前月--开始日期
public static String getMinMonthDate(String date) {
Calendar calendar = Calendar.getInstance();
try {
calendar.setTime(dateFormat.parse(date));
calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMinimum(Calendar.DAY_OF_MONTH));
return dateFormat.format(calendar.getTime());
} catch (java.text.ParseException e) {
e.printStackTrace();
}
return null;
}
// 获得当前月--结束日期
public static String getMaxMonthDate(String date){
Calendar calendar = Calendar.getInstance();
try {
calendar.setTime(dateFormat.parse(date));
calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
return dateFormat.format(calendar.getTime());
} catch (java.text.ParseException e) {
e.printStackTrace();
}
return null;
}
/*
获取每一个月开始的时间和结束时间 endTime 结束的时间
* @param startTime
*/
public static List<Date> getTime() throws ParseException {
List<Date> stringList=new ArrayList<>();
Calendar calendar= Calendar.getInstance();
SimpleDateFormat dateFormat= new SimpleDateFormat("yyyy-MM-dd");
String format = dateFormat.format(calendar.getTime());
String minMonthDate = getMinMonthDate(format);
//开始的时间
String startTime = minMonthDate+" 00:00:00";
SimpleDateFormat dateForm= new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
Date date = dateForm.parse(startTime);
stringList.add(date);
//结束的时间
String maxMonthDate = getMaxMonthDate(format);
String endTime = maxMonthDate+" 59:59:59";
Date dat= dateForm.parse(endTime);
stringList.add(dat);
return stringList;
}
public static Date getSpecifiedTime(String dateTime) {
Date d = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String dateNowStr = sdf.format(d);
log.info(dateNowStr);
String startTime = dateNowStr+" "+dateTime;
log.info(dateTime);
SimpleDateFormat dateForm= new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
Date date = null;
try {
date = dateForm.parse(startTime);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
/**
* 根据日期获取周几
* @param dateAttendanceStatus
* @return
*/
public static String getWeekday(Date dateAttendanceStatus) {// 必须yyyy-MM-dd
SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd");
String date= sd.format(dateAttendanceStatus);
SimpleDateFormat sdw = new SimpleDateFormat("E");
Date d = null;
try {
d = sd.parse(date);
} catch (ParseException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return sdw.format(d);
}
public static Date getDate(Date date){
SimpleDateFormat sd = new SimpleDateFormat("MM-dd");
String date1= sd.format(date);
Date parse=null;
try {
parse = sd.parse(date1);
} catch (ParseException e) {
e.printStackTrace();
}
return parse;
}
/**
* 获取时间的月份
* @param
*/
public static int queryMonthAcquisitionTime(Date date){
Calendar ca = Calendar.getInstance();
ca.setTime(date);
int month = ca.get(Calendar.MONTH)+ 1;//第几个月
return month;
}
/**
* 获取当前日期的前3个月时间
* @param
* @return
*/
public static Date queryGetFirstMonths(){
Date dNow = new Date();
Calendar calendar = Calendar.getInstance();
calendar.setTime(dNow);
calendar.add(Calendar.MONTH, -2);//得到前3个月
Date formNowthreeMonth = calendar.getTime();
return formNowthreeMonth;
}
public static void main(String[] args) throws ParseException {
//
}
public static long get_d_plaus_1(Calendar c) {
//day_of_month
c.set(Calendar.DAY_OF_MONTH, c.get(Calendar.DAY_OF_MONTH) + 1);
return c.getTimeInMillis();
}
/**
* 根据年和月获取这个月开始的时间
* @param year
* @param month
* @return
*/
public static Date getBeginTime(int year, int month) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
YearMonth yearMonth = YearMonth.of(year, month);
LocalDate localDate = yearMonth.atDay(1);
LocalDateTime startOfDay = localDate.atStartOfDay();
ZonedDateTime zonedDateTime = startOfDay.atZone(ZoneId.of("Asia/Shanghai"));
return Date.from(zonedDateTime.toInstant());
}
/**
* 根据年和月获取这个月结束的时间
* @param year
* @param month
* @return
*/
public static Date getEndTime(int year, int month) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
YearMonth yearMonth = YearMonth.of(year, month);
LocalDate endOfMonth = yearMonth.atEndOfMonth();
LocalDateTime localDateTime = endOfMonth.atTime(23, 59, 59, 999);
ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.of("Asia/Shanghai"));
return Date.from(zonedDateTime.toInstant());
}
/**
* 根据月获取开始和结束的时间
*/
public static List<String> queryStartTimesMonth(int month){
List<String> dateList=new ArrayList<>();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy");
Date date = new Date();
//获取当前年份
String year=sdf1.format(date);
log.info("当前的年份是========="+year);
Date beginTime = getBeginTime(Integer.parseInt(year), month);
System.out.println("开始的时间"+sdf.format(beginTime));
dateList.add(sdf.format(beginTime));
Date endTime = getEndTime(Integer.parseInt(year), month);
System.out.println("结束的时间"+sdf.format(endTime));
dateList.add(sdf.format(endTime));
return dateList;
}
/**
* 获取时间的日
*/
public static int GetsDayTime(Date date){
Calendar cal = Calendar.getInstance();
cal.setTime(date);
int day = cal.get(Calendar.DATE);
return day;
}
/**
* 将字符串转成data
*/
public static Date convertStringData(String dataString){
Date date=null;
try {
date = new SimpleDateFormat("yyyy-MM-dd").parse(dataString);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
}
时分秒的处理经常遇到
DateFormat simpleDateFormat = DateFormat.getTimeInstance();
当前时间的时分秒
String format = simpleDateFormat.format(new Date);
时分秒进行相减
public class TimeOperate {
public static void main(String[] args) {
Date date = new Date();
Calendar calendar= Calendar.getInstance();
SimpleDateFormat dateFormat= new SimpleDateFormat("yyyy-MM-dd");
String format = dateFormat.format(calendar.getTime());
//开始的时间
String startTime = format+" 00:00:00";
System.out.println(startTime);
//结束的时间
String endTime = format+" 59:59:59";
System.out.println(endTime);
int sub = TimeOperate.sub("9:59:00","9:45:00");
System.out.println(sub);
}
/**
* 两个时间的加法运算
* 注意: 请传入 HH:mm:ss 格式的数据
* @param time1 被加数
* @param time2 加数
* @return 返回加法运算后的结果
*/
public static String add(String time1, String time2){
String time = null;
try {
SimpleDateFormat sf = new SimpleDateFormat("HH:mm:ss"); //被加数 字符串格式化
Date date1 = sf.parse(time1);
Calendar calendar1 = Calendar.getInstance();
calendar1.setTime(date1);
Date date2 = sf.parse(time2); //加数 字符串格式化
Calendar calendar2 = Calendar.getInstance();
calendar2.setTime(date2);
int hour = calendar2.get(Calendar.HOUR_OF_DAY); //获取加数 小时
int min = calendar2.get(Calendar.MINUTE); //获取加数 分钟
int second = calendar2.get(Calendar.SECOND); //获取加数秒
//加法运算
calendar1.add(Calendar.HOUR, hour);
calendar1.add(Calendar.MINUTE, min);
calendar1.add(Calendar.SECOND, second);
time = sf.format(calendar1.getTime());
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
return time;
}
/**
* 两个时间的减法运算
* 注意: 请传入 HH:mm:ss 格式的数据
* @param time1 被减数
* @param time2 减数
* @return
*/
public static int sub(String time1, String time2){
String time = null;
double pp=0;
int i=0;
try {
SimpleDateFormat sf = new SimpleDateFormat("HH:mm:ss"); //被加数 字符串格式化
Date date1 = sf.parse(time1);
Calendar calendar1 = Calendar.getInstance();
calendar1.setTime(date1);
Date date2 = sf.parse(time2); //加数 字符串格式化
Calendar calendar2 = Calendar.getInstance();
calendar2.setTime(date2);
int hour = calendar2.get(Calendar.HOUR_OF_DAY); //获取加数 小时
int min = calendar2.get(Calendar.MINUTE); //获取加数 分钟
int second = calendar2.get(Calendar.SECOND); //获取加数秒
//减法运算
calendar1.add(Calendar.HOUR, -hour);
calendar1.add(Calendar.MINUTE, -min);
calendar1.add(Calendar.SECOND, -second);
time = sf.format(calendar1.getTime());
int index1=time.indexOf(":");
int index2=time.indexOf(":",index1+1);
int hh=Integer.parseInt(time.substring(0,index1));
int mi=Integer.parseInt(time.substring(index1+1,index2));
int ss=Integer.parseInt(time.substring(index2+1));
System.out.println(hh*60*60+mi*60+ss);
float h=(hh*60*60+mi*60+ss);
float k=h/60/60;
if (k>0&&k<0.5){
k=1;
}
//进行四舍五入
pp = Math.ceil((double) k);
i=new Double(pp).intValue();
// pp= Math.round((float)k);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
return i;
}
}
都是基础但是,开发需要就是基础,希望可以给你带来,新的感觉,看一遍明白,原来还可以这样,加油,也谢谢你的关注,高级的问题可以加我微信问我,基础也是非常重要,有时候会搞出笑话
舔狗故事
哎,一直努力赚钱,但是她给我当成舔狗
你不要找学习计算机的女孩子好不好,毕竟我就是一个外包,还4年才没有到30k,学计算机女孩子女孩子会看不起你的,会天天跟你吵架,跟你说,你技术菜,毕竟计算机这行工资高,说你为什么别人可以你还是外包的,这么菜,毕竟人家点点头,师兄就会爱上他,每一个学习代码女孩子都是为提高工资,都以为技术高有高工资,但是她们不知道不代表每一个人都可以进阿里巴巴
毕竟就是一个写jsp的女孩子会看不起你的,会天 天跟你吵架,跟你说,你技术菜,毕竟计算机这行工资高,说你为什么别人可以你还是写jsp的,哎
毕竟人家点点头,阿里巴巴的人和腾讯 小哥哥都会给她解决问题,而你狗屁不是 叫叫哥哥,同事就会给她解决问题,而你会被看不起,被骂,说这不是我的接口,跟我有什么关系
可能每一个男孩子跟女孩子表白,女孩子都会这样说,正常,因为她看不起你,你狗屁没有,但是,她还想要你当她舔狗就会这样说,她看不起你,只是以这种形式说出来而已
毕竟人家点点头都可以跟郑大结婚,
没有钱,就会跟上面表白一样,表面说你耽误她,现实看不起你
ctmd的狗女人,真98作,大半夜给我发消息说失恋了,我发了一堆安慰的话,屁都不放一个,搞得老子跟舔狗一样,我操你失恋了,你就找我,完美,过几天又和好了,你他妈啥意思
记住一定不能跟我学习,我是废物,哎,难,一辈子孤单
记住我,我是上海从此不做舔狗,我经历好多事情,遇到好多普信女,心中只有技术,谢谢你的关注
发表评论 取消回复