You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的原因

这里要分两部分看:

  1. Integer i31 = 2; 这行是自动装箱——Java把int值2转换成Integer对象。但为了优化性能,Java对-128到127之间的Integer值做了缓存(这个缓存是IntegerCache类实现的),所以这里的i31指向的是缓存池里已经存在的那个值为2的Integer对象,不会新建对象。
  2. Integer i32 = new Integer(2); 这行用new关键字创建对象,不管值是多少,Java都会在堆内存里新建一个全新的Integer对象,和缓存池里的对象完全是两个不同的实例。

这时候用==比较i31和i32,其实是在比较两个对象的内存地址——一个是缓存池里的地址,一个是新对象的地址,肯定不一样,所以结果是false。

总结一下关键点

  • 基本类型和包装类型用==时,包装类型会自动拆箱成基本类型,比的是值
  • 自动装箱创建Integer对象时,-128到127范围内会复用缓存对象;用new Integer()则总是新建对象
  • 引用类型之间用==,永远比的是对象地址,要比值的话记得用equals()方法

内容的提问来源于stack exchange,提问作者utkarsh dubey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:44:25