我发现当 x 和 y 自动装箱到 400 时,输出不相同但是当< strong> x 和 y 被自动装箱到 40 它们会一样。为什么?
public class Demo1 {
public static void main(String args[]) {
Integer x = 400, y = 400;
if (x == y)
System.out.println("Same");
else
System.out.println("Not Same");
}
}
答案 0 :(得分:4)
作为优化,JVM在启动时会缓存一些Integer
引用(来自-128到+127的引用)。
所以等于40的Integer
将引用该缓存中的一个。这就是为什么值为40的两个引用将比较相等:它们都指向相同的缓存对象。
由于400在缓存范围之外,设置为400的Integer
引用不会引用缓存对象,因此具有该值的两个引用将不会比较相等。
答案 1 :(得分:2)
这是因为Java Integer缓存。当一个数字在缓存中时,引用从缓存中被用于一个而不是创建一个新对象。在您的情况下,40位于缓存中,因此对象引用是相同的,但400位于缓存之外,因此对象不是相同的引用。请参阅this answer。