Java整数内存分配

时间:2011-03-16 10:13:22

标签: java memory integer

嘿,我正在尝试理解以下代码段。

public static void main(String[] args) {
    Integer i1 = 1000;
    Integer i2 = 1000;
    if(i1 != i2) System.out.println("different objects");
    if(i1.equals(i2)) System.out.println("meaningfully equal");
    Integer i3 = 10;
    Integer i4 = 10;
    if(i3 == i4) System.out.println("same object");
    if(i3.equals(i4)) System.out.println("meaningfully equal");
}

此方法运行所有println指令。那是i1!= i2是真的,但是i3 == i4。乍一看这让我觉得奇怪,它们应该是不同的参考。我可以弄清楚,如果我将相同的字节值(-128到127)传递给i3和i4,它们将始终等于引用,但任何其他值都会将它们视为不同。

我无法解释这一点,您能指出一些文档或提供一些有用的见解吗?

谢谢

3 个答案:

答案 0 :(得分:12)

int值自动装箱到Integer个对象将使用缓存来表示常见值(正如您已识别出来的那样)。这在JLS at §5.1.7 Boxing Conversion

中指定
  

如果框中的值ptruefalsebytechar范围为\u0000至{{ 1}},或\u007fint之间的short-128号码,然后让127r1成为任意两个的结果r2的拳击转换。 p

总是如此

请注意,当您使用Integer.valueOf()时语言为您自动设置值时,将。使用new Integer(int)始终生成新的r1 == r2.对象。

次要提示:JVM实现也可以自由地缓存这些范围之外的值,因为没有指定相反的值。但是,我还没有看到这样的实现。

答案 1 :(得分:2)

Java在-128和128之间保留一个Integer池。如果在此范围之外使用Integer,则会创建新的Integer对象。这是解释。

您可以在Java源代码中看到它:

public static Integer valueOf(int i) {
        if(i >= -128 && i <= IntegerCache.high)
            return IntegerCache.cache[i + 128];
        else
            return new Integer(i);
    }

答案 2 :(得分:1)

-128到127之间的整数被包装到固定对象中。这就是为什么你得到i3 == i4。