Integer在-128~127范围内缓存复用对象,故==比较为true;超范围则新建对象,==为false;混用基本类型会自动拆箱;判断数值相等应统一用equals()或Objects.equals()。

因为 == 比较的是对象引用,不是数值本身,而 Java 对 Integer 在 -128 到 127(含)范围内做了缓存优化,超出范围则每次新建对象。
缓存范围内的值复用同一对象
当赋值在 -128~127 之间时(例如 Integer a = 100; Integer b = 100;),JVM 通过 Integer.valueOf() 返回缓存中的同一个实例。所以 a == b 是 true——它们指向内存中同一个地址。
- 这个缓存由
IntegerCache实现,是 JVM 启动时预加载的 - 自动装箱(如
Integer a = 127;)会触发该缓存逻辑 - 手动用
new Integer(127)不走缓存,永远是新对象
超出缓存范围就创建新对象
比如 Integer c = 128; Integer d = 128;,两个变量分别在堆上新建了独立的 Integer 实例,内存地址不同,c == d 结果为 false。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 128 及以上、-129 及以下的整数默认不缓存
- 可通过 JVM 参数
-Djava.lang.Integer.IntegerCache.high=200扩展上限(但不推荐滥用) - 这种行为只适用于
Integer,Long、Double等没有默认缓存(Long.valueOf()有小范围缓存,但仅限 -128~127)
和基本类型 int 混用时容易误判
如果一边是 Integer,一边是 int(如 a == 100),Java 会自动拆箱,把 Integer 转成 int 再比较值,此时 == 看起来“正常”,但这只是隐式转换的结果,并非对象间相等。
立即学习“Java免费学习笔记(深入)”;
-
Integer a = 100; int b = 100; a == b→ 拆箱后比较数值,结果true -
Integer a = null; a == 0→ 运行时报NullPointerException -
Integer a = 100; Double b = 100.0; a == b→ 编译失败(类型不兼容)
正确做法:统一用 equals() 比较值
无论是否在缓存范围内,只要想判断“数值是否相等”,就该用 .equals():
-
a.equals(b)安全可靠,内部先判null,再比intValue() -
Objects.equals(a, b)更健壮,可防null异常 - 避免在
if、switch或集合key场景中依赖==判断Integer

















