java中的自动装箱?

java中的自动装箱?,java,autoboxing,Java,Autoboxing,我发现当x和y自动装箱到400时,输出是不一样的,但当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.p

我发现当xy自动装箱到400时,输出是不一样的,但当xy自动装箱到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");
    }
}

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

因此,等于40的
整数将引用该缓存中的一个整数。这就是为什么两个值为40的引用会比较相等:它们都引用同一个缓存对象


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

作为优化,JVM在启动时缓存一些
整数
引用(从-128到+127的引用)

因此,等于40的
整数将引用该缓存中的一个整数。这就是为什么两个值为40的引用会比较相等:它们都引用同一个缓存对象


由于400不在缓存范围内,设置为400的
整数
引用将不会引用缓存对象,因此具有该值的两个引用将不相等。

这是因为Java整数缓存。当一个数字在缓存中时,引用将从缓存初始化为一,而不是创建一个新对象。在您的例子中,40在缓存内,因此对象引用相同,但400在缓存外,因此对象不是相同的引用。请参阅。

这是因为Java整数缓存。当一个数字在缓存中时,引用将从缓存初始化为一,而不是创建一个新对象。在您的情况下,40在缓存内,因此对象引用相同,但400在缓存外,因此对象不是相同的引用。请参阅。

@Paul-不,不是。这个问题是关于基本包装类型的缓存行为。比较对象是一个更广泛的问题。。。你提出的重复答案甚至与此无关。在我尝试之前,我无法相信这种行为。这很可能是重复的,但对于这个特定的问题(缓存特定的
整数
),重复的不是好的。投票决定重新开放。我同意@Bathsheba的观点。这个问题与提供的问题不同。@AnilKumar是的,sry。我想这只是比较物体的惯常做法。我投了赞成票reopen@Paul-不,不是。这个问题是关于基本包装类型的缓存行为。比较对象是一个更广泛的问题。。。你提出的重复答案甚至与此无关。在我尝试之前,我无法相信这种行为。这很可能是重复的,但对于这个特定的问题(缓存特定的
整数
),重复的不是好的。投票决定重新开放。我同意@Bathsheba的观点。这个问题与提供的问题不同。@AnilKumar是的,sry。我想这只是比较物体的惯常做法。我投票决定将其添加到缓存中,==在缓存中起作用(在您的示例中为40),因为实例x和y都引用缓存中完全相同的对象,而当您创建x=400和y=400时,它们引用内存中的不同对象。要添加到这一点,==在缓存中起作用(在您的示例中为40),因为实例x和y都引用缓存中完全相同的对象,而创建x=400和y=400时,它们引用内存中的不同对象。