public class TestMe{
public static void main(String[] args) {
Integer i = 128;
Integer j = 128;
Integer k = 12;
Integer l = 12;
System.out.println(i == j);
System.out.println(k == l);
}
}
我得到了输出: 假 真
为什么第一个是假的而第二个是真的?
答案 0 :(得分:6)
请参阅: http://javapapers.com/java/java-integer-cache/
简短回答:
在Java 5中,引入了一项新功能来保存内存并提高Integer类型对象处理的性能。整数对象在内部缓存,并通过相同的引用对象重用。
这适用于介于-127到+127之间的整数值。
此整数缓存仅适用于自动装箱。使用构造函数构建整数对象时,它们不会被缓存。
答案 1 :(得分:5)
-128和127之间的整数值被缓存用于Integer.valueOf(...)方法,这些方法经常被许多运算符使用,自动装箱并在后台由编译器调用。您可以通过VM选项-XX:AutoBoxCacheMax = size。
来增加此缓存范围你的台词:
Integer k = 12;
Integer l = 12;
实际上是由编译器翻译成:
Integer k = Integer.valueOf(12);
Integer l = Integer.valueOf(12);
这就是为什么k和l实例对缓存实例只有一个相互的Integer引用。 这个原则也适用于其他包装类。