在java中自动装箱?

时间:2015-09-21 12:24:16

标签: java autoboxing

我发现当 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");
    }
}

2 个答案:

答案 0 :(得分:4)

作为优化,JVM在启动时会缓存一些Integer引用(来自-128到+127的引用)。

所以等于40的Integer将引用该缓存中的一个。这就是为什么值为40的两个引用将比较相等:它们都指向相同的缓存对象。

由于400在缓存范围之外,设置为400的Integer引用不会引用缓存对象,因此具有该值的两个引用将不会比较相等。

答案 1 :(得分:2)

这是因为Java Integer缓存。当一个数字在缓存中时,引用从缓存中被用于一个而不是创建一个新对象。在您的情况下,40位于缓存中,因此对象引用是相同的,但400位于缓存之外,因此对象不是相同的引用。请参阅this answer