为什么某些Integer对象的== true?

时间:2011-12-08 07:07:37

标签: java integer

  

可能重复:
  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,因为它是与==关系运算符的引用比较。但是第三次​​印刷错误,我不明白这种不一致。

非常感谢解释!

4 个答案:

答案 0 :(得分:33)

在第一种情况下,对象ij都指向同一个缓存对象。默认情况下,-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 iInteger j包含整数范围内的整数值,Integer范围为-128 to 128Integer n }和Integer m超出了Integer

的范围