可能重复:
Integer wrapper objects share the same instances only within the value 127?
我从Khalid Mughal SCJP复制了以下程序片段,但我无法
理解输出。
public class RQ200_60 {
public static void main(String[] args) {
Integer i = -10;
Integer j = -10;
System.out.print(i==j); // output: true -- why true?
System.out.print(i.equals(j)); // output: true
Integer n = 128;
Integer m = 128;
System.out.print(n==m); // output: false
System.out.print(n.equals(m)); // output: true
}
}
上面的程序为第一个print语句提供true,但它应该给出false,因为它是与==关系运算符的引用比较。但是第三次印刷错误,我不明白这种不一致。
非常感谢解释!
答案 0 :(得分:33)
在第一种情况下,对象i
和j
都指向同一个缓存对象。默认情况下,-128和127之间的范围缓存为Integer
对象。我们可以使用JVM arguments
答案 1 :(得分:11)
关于缓存的答案是正确的。但是,如果你去......
Integer i = new Integer(10);
Integer j = new Integer(10);
...然后你避免缓存,结果将是你所期望的。
答案 2 :(得分:8)
可以为表示接近0的值的高速缓存整数对象 。(实现的规范可能会告诉您一些细节)。这可能是为了节省内存(接近0的值很常见,并且会浪费大量内存来为每个具有相同值的变量创建一个新对象。)
==
检查两件事是否是同一个对象;对于具有相同值的任何两个给定变量,可能是否可能具有相同的Integer对象。您不应该与==
核对,因为您不应该关心它是否是同一个对象;重要的是Integer
的价值,而不是它的身份。
答案 3 :(得分:1)
在这种情况下,Integer i
和Integer j
包含整数范围内的整数值,Integer
范围为-128 to 128
,Integer n
}和Integer m
超出了Integer