由Integer的==和equals()比较区别引起的思考(涉及自动拆装箱知识)

如图:

上述结果描述:

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方法,只用来比较值。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 引入 == 基本数据类型(也称原始数据类型) :byte,short,char,int,long,float,do...
    凯诺婷阅读 1,290评论 1 7
  • Java8张图 11、字符串不变性 12、equals()方法、hashCode()方法的区别 13、...
    Miley_MOJIE阅读 3,867评论 0 11
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 33,819评论 18 399
  • 这几天被校长安排到了教育局中小学卫生保健所实习,纯粹是个摆设,体验了关系的复杂与简单,官场的是非分明,看到教材的那...
    大伟5555阅读 117评论 0 0
  • 七月前后正值炎炎夏日,热情的太阳辐射大地,紧接着夏风也吹遍了原野,夏日迎着和风为大地送来了绿色的衣裙,将大地装饰的...
    皖南医学院阅读 422评论 0 0

友情链接更多精彩内容