在 java 中自动装箱?
Autoboxing in java?
我发现当 x 和 y 被自动装箱到 400 时,输出是 不一样 但是当 x 和 y 被自动装箱到 40他们是 same.Why??
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 的引用)。
所以 Integer
等于 40 将引用该缓存中的一个。这就是为什么两个值为 40 的引用比较相等:它们都引用同一个缓存对象。
由于 400 在缓存范围之外,Integer
引用设置为 400 将不会引用缓存对象,因此具有该值的两个引用不会比较相等。
这是因为 Java 整数缓存。当一个数字在缓存中时,引用被初始化为缓存中的一个,而不是创建一个新对象。在您的情况下,40 在缓存内,因此对象引用相同,但 400 在缓存外,因此对象不相同 reference.See this answer.
我发现当 x 和 y 被自动装箱到 400 时,输出是 不一样 但是当 x 和 y 被自动装箱到 40他们是 same.Why??
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 的引用)。
所以 Integer
等于 40 将引用该缓存中的一个。这就是为什么两个值为 40 的引用比较相等:它们都引用同一个缓存对象。
由于 400 在缓存范围之外,Integer
引用设置为 400 将不会引用缓存对象,因此具有该值的两个引用不会比较相等。
这是因为 Java 整数缓存。当一个数字在缓存中时,引用被初始化为缓存中的一个,而不是创建一个新对象。在您的情况下,40 在缓存内,因此对象引用相同,但 400 在缓存外,因此对象不相同 reference.See this answer.