在 Java 中缓存装箱值

Caching of boxed values in Java

我有以下代码:

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);

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

为什么会这样?

因为这些分配是使用“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

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

对于引用类型(Integer),使用equals比较两个Integer的值,==比较引用是否指向同一个对象(即共享相同的地址)。在大多数情况下,它是您想要的 equals 而不是 ==.

对于原始类型 (int),您必须使用 ==,它将值与两个 int 进行比较。 (equals 不起作用,因为它仅在对象上定义,哪些基元不是定义的。)

在您的问题中,您使用的是 new Integer(3) 关键字,它会在池中创建一个新对象。因此,对象引用是不一样的。

有关详细信息,请参阅 this link