JAVA中包装类的比较
前言:本文主要给大家分享关于Java包装类在比较时遇到的一些问题的解决方法,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。
例:Integer a = 1;
Integer b = 1;
Integer c = new Integer(1);
Integer d = new Integer(1);
Long l = 1L;
Integer f = 128;
Integer g = 128;
System.out.println(a == b); //1. 但是这里会提示建议,建议用equals();
System.out.println(a.equals(b));//2.
System.out.println(a==c);//3.
System.out.println(c==d);//4.
System.out.println(c.equals(d));//5.
System.out.println(a == l);//6.
System.out.println(a.equals(l));//7.
System.out.println(f==g);//8.
输出结果:
true
true
false
false
true
// 6:这里会报出错误,因为两个不是一个类型,
false
false
1.包装类比较,不会自动拆包,但是Integer中会有一个cache 存储-128到127的数,所以f与g的地址值不相同。
2.地址值比较,没用到cache
3.当 '=='时,右侧发生自动拆包,所以其实是int值在比较
4.a+b 时拆包成int,传入Integer的equals方法进行自动装包。equals方法内是值比较。
5.会拆包成基础数据类型比较
6.包装类的equals 会判断类型,Long.equals(Object object)中判断类型不符合,返回false。
总结:
当使用自动拆包/装包时,包装类之间比较并不会自动拆包,是地址比较,其中还有缓存会影响结果。
用包装类的equals方式比较时,由于包装类并不会自动去转换类型,所以类型不同时,即使值相同,也会返回false。所以在用包装类比较数值时,不要用'==',用equals方法时要注意类型相同,或者直接用基础数据类型比较。