Java Integer Wrapper类相关

Kit*_*tts 4 java

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);
  }
}
Run Code Online (Sandbox Code Playgroud)

我得到输出:false true

为什么第一个是假的而第二个是真的?

小智 6

请参阅:http: //javapapers.com/java/java-integer-cache/

简短回答:

在Java 5中,引入了一个新功能来保存内存并提高Integer类型对象处理的性能.整数对象在内部缓存,并通过相同的引用对象重用.

这适用于介于-127到+127之间的整数值.

此整数缓存仅适用于自动装箱.使用构造函数构建整数对象时,它们不会被缓存.


Coo*_*tri 5

对于Integer.valueOf(...)方法,缓存介于-128和127之间的整数值,这些方法经常被许多运算符使用,自动装箱并在后台由编译器调用.您可以通过VM选项-XX增加此缓存范围:AutoBoxCacheMax = size.

你的台词:

Integer k = 12;
Integer l = 12;
Run Code Online (Sandbox Code Playgroud)

实际上是由编译器翻译成:

Integer k = Integer.valueOf(12);
Integer l = Integer.valueOf(12);
Run Code Online (Sandbox Code Playgroud)

这就是为什么k和l实例只有一个对缓存实例的相互Integer引用.该原则也适用于其他包装类.