Java整数内存分配

Java整数内存分配,java,memory,integer,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;

嘿,我正在努力理解下面的代码片段

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,它们作为引用总是相等的,但任何其他值都会产生不同的值

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


谢谢

int
值自动装箱到
Integer
对象将使用缓存来缓存公共值(如您所识别的)。这在以下文件中有详细说明:

如果要装箱的值
p
true
false
,一个
字节
,一个
字符
,范围为
\u0000
\u007f
,或
int
short
介于
-128
127
之间的数字,然后将
r1
r2
作为
p
的任意两个装箱转换的结果。通常情况下,
r1==r2。

请注意,这将仅在语言自动为您设置值框或使用时应用。使用将始终生成一个新的
整数
对象


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

Java保留了一个介于-128和128之间的整数池。如果使用超出此范围的整数,将创建新的整数对象。这就是解释

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

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

如果(i>=-128&&i从-128到127的整数被包装到固定对象中。这就是为什么会得到i3==i4。

我认为整数上下文中使用的整数文本是使用
Integer.valueOf(…)
转换的,而不是
新整数(…)