自动拆装箱

Integer a = 1;
Integer b = 2;
Long c = 3L;
Integer d = 333;
Integer e= 333;
System.out..println(c==(a+b));//第一个
System.out..println(c.equals(a+b));//第二个
System.out..println(d==e);//第三个
System.out..println(d.equals(e));//第四个
---------------分割线------------------------------
答案是什么来着?隔把问题发出来有几个小时,又不确定了。也不知道想法对与不对。
true
false
false
true
-----------------------------------------------
第一个是a和b相加时,首先进行了拆箱,然后计算,计算完成后又自动装箱,最终是两个对象之间的直接比较,==直接比较两个对象引用的地址,这里是计算出来的值为3,且为long类型的值,是在Long 对象池中已经存在了,因此判断两种相等,即引用同一地址。调试发现实际上该计算等同于(long)3L==1+2。
第二个,equals为值比较,由于这里计算的a+b自动装箱为Integer类型,Long的equals方法判断为非Long类型,返回为false,结果为不相等;
第三个,超过128的整型包装类是不使用对象池,因此333存储地址不同,e和f引用不同地址,两者引用地址不相等;
第四个,值判断,相等

原文地址:https://www.cnblogs.com/oldfish/p/3559977.html