1.使用Objects.equals的好处
JDK1.7提供的Objects.equals方法,非常方便地实现了对象的比较,有效地避免了繁琐的空指针检查,例如:
Objects.equals("1","1");//true
Objects.equals(null,"1");//false
Objects.equals("1",null);//false
Objects.equals(null,null);//true
2.Objects.equals中的坑
虽然它能有效的避免空指针问题,但是在处理基础数据类型和封装类型的比较时会出现一些让人意想不到的问题,如下:
Long a=1L;int b=1;
System.out.println(Objects.equals(b,a));//false
System.out.println(Objects.equals(a,b));//false
System.out.println(a==b);//true
前两个竟然输出的是false!和想的太不一样了!
跟踪一下源码:
publicstaticbooleanequals(Object a, Object b){return(a== b)||(a!= null&& a.equals(b));}
发现:Objects.equals在进行比较时会自动对基本类型做封装,也就是说它把int变成了Integer,使用了Long的equals方法进行了比较,如下:
publicbooleanequals(Object obj){if(objinstanceofLong){return value==((Long)obj).longValue();}returnfalse;}
结果就是一个Integer一个是Long,类型不一样,直接返回false,真坑!
==就不同了,它自动拆封了