美文网首页瘪嘴程序员
Integer的==和equals()比较(涉及自动拆装箱知识)

Integer的==和equals()比较(涉及自动拆装箱知识)

作者: 幽游不想吃饭 | 来源:发表于2018-06-25 12:36 被阅读18次

    如图:

    上述结果描述:

    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方法来实现我们需要的目的。

    5、如何修改缓存的cache数组(待补充)?

    6、String类中重写了equals方法,只用来比较值。

    相关文章

      网友评论

        本文标题:Integer的==和equals()比较(涉及自动拆装箱知识)

        本文链接:https://www.haomeiwen.com/subject/ojtyyftx.html