如图:
上述结果描述:
1、以上代码第一段和第二段旨在说明:在-128~127的Integer值并且以Integer x = value;的方式赋值的Integer值在进行==和equals比较时,都会返回true,因为Java里面对处在在-128~127之间的Integer值,用的是原生数据类型int,会在内存里供重用,也就是说这之间的Integer值进行==比较时只是进行int原生数据类型的数值比较,而超出-128~127的范围,进行==比较时是进行地址及数值比较。
2、第三段旨在说明:==和equals的区别,==是进行地址及值比较,无法对==操作符进行重载,而对于equals方法,Integer里面的equals方法重写了Object的equals方法,查看Integer源码可以看出equals方法进行的是数值比较。
总结:
1、equals方法默认比较的是对象引用地址,为何equals全是true?因为:Interger类重写了equals方法,Integer中equals方法进行的是对值的比较。
2、为何第一段和第二段的“==”的结果输出不同?因为:通过"Integer a = 1"来创建对象时,是在进行自动拆装箱时,编译器会使用Integer.valueof()来创建Integer实例;当使用valueof方法时,当创建的数值在-128-127之间时,他会去IntegerCache中的一个cache缓存数组中拿的Interger对象,所以说第一段代码结果为true;第二段代码创建的两个值超过了-128-127范围,所以他是创建的两个新的对象引用地址,所以第二段代码结果为false。同时解释了为何第三段代码的输出情况。(通过new初始化Integer对象实际上而是创建的新的对象引用地址)
扩展:
1、
2、IntegerCache有一个静态的Integer数组,在类加载时就将-128 到 127 的Integer对象创建了,并保存在cache数组中。
3、对于基础类型的比较来说,"=="比较的是值是否相同,对于对象引用(我们操纵对象实际上都是操纵对象的引用)来说,比较的则是引用地址和值。
4、equals默认比较的是对象的引用地址,即不同包装类型之间的equals比较默认是false;但是可以通过重写equals方法来实现我们需要的目的。
5、如何修改缓存的cache数组(待补充)?
6、String类中重写了equals方法,只用来比较值。