在 Java 中缓存装箱值

Man*_*oid 3 java autoboxing

我有以下代码:

Integer first = new Integer(4);
Integer second = new Integer(4);
System.out.println(first == second);
Integer third = 4;
System.out.println(first == third);
System.out.println(second == third);
Run Code Online (Sandbox Code Playgroud)

由于 4 介于 -128 到 127 之间,我希望包装 4 的 Integer 对象在第一次创建后就被缓存,然后为其他装箱语句返回,因此 '==' 检查必须返回 true。但对于以上三种情况,它总是错误的。

为什么会这样?

Muk*_*shu 5

由于这些分配是使用“ new”关键字进行的,因此它们是创建的新实例,而不是从池中提取。另请注意,整数池仅包含从 -128 到 127 的整数。对于更高的值,池不会发挥作用。

Integer third = 4;
Integer fourth = 4;
Integer fifth = 130;
Integer sixth = 130;
Integer seventh = 127;
Integer eighth = 127;
System.out.println(third == fourth); // 4==4 Return true
System.out.println(fifth == sixth); // 130==130 Returns false
System.out.println(seventh == eighth); // 127==127 Returns true
Run Code Online (Sandbox Code Playgroud)

编辑 正如评论中正确提到的,从 Java 1.6 开始,可以使用-XX:AutoBoxCacheMax=new_limitfrom 命令行扩展自动框限制。