Java中两种Integer相等性检查结果差异的原因咨询
为什么这两个
==比较的结果不一样? 这个问题其实和函数作用域没关系哦,核心是Java里的自动拆箱/装箱、Integer缓存机制,还有==运算符的本质,我来给你掰碎了讲:
先搞懂==到底比的是什么
- 对于基本数据类型(比如int、long这些),
==比较的是实际的值 - 对于引用类型(比如Integer、String这些对象),
==比较的是对象在堆内存中的地址——只有当两个引用指向同一个对象时,结果才是true
第一个例子:5 == new Integer(5) 输出true的原因
这里左边的5是int基本类型,右边的new Integer(5)是Integer引用类型。当基本类型和包装类型用==比较时,Java会触发自动拆箱机制:把右边的Integer对象转换成int基本类型(底层其实是调用了Integer.intValue()方法)。
拆箱之后,就变成了两个int值5和5的比较,自然结果是true。
第二个例子:Integer i31 = 2; Integer i32 = new Integer(2); System.out.println(i31 == i32); 输出false的原因
这里要分两部分看:
Integer i31 = 2;这行是自动装箱——Java把int值2转换成Integer对象。但为了优化性能,Java对-128到127之间的Integer值做了缓存(这个缓存是IntegerCache类实现的),所以这里的i31指向的是缓存池里已经存在的那个值为2的Integer对象,不会新建对象。Integer i32 = new Integer(2);这行用new关键字创建对象,不管值是多少,Java都会在堆内存里新建一个全新的Integer对象,和缓存池里的对象完全是两个不同的实例。
这时候用==比较i31和i32,其实是在比较两个对象的内存地址——一个是缓存池里的地址,一个是新对象的地址,肯定不一样,所以结果是false。
总结一下关键点
- 基本类型和包装类型用
==时,包装类型会自动拆箱成基本类型,比的是值 - 自动装箱创建Integer对象时,-128到127范围内会复用缓存对象;用
new Integer()则总是新建对象 - 引用类型之间用
==,永远比的是对象地址,要比值的话记得用equals()方法
内容的提问来源于stack exchange,提问作者utkarsh dubey
相关产品推荐
相关产品推荐

