这两个几乎完全相同的代码块有什么区别?

时间:2016-02-26 07:17:44

标签: java

我有这段代码:

int i = 128;
Integer a = i;
Integer b = i;
System.out.println("a==i " + (a == i)); // true
System.out.println("b==i " + (b == i)); // true
System.out.println("a==b " + (a == b)); // false
System.out.println("equals ->"  + a.equals(i)
                                + b.equals(i)
                                + a.equals(b)); // true, true, true

然后我将变量i更改为127:

int i = 127;
Integer a = i;
Integer b = i;
System.out.println("a==i " + (a == i)); // true
System.out.println("b==i " + (b == i)); // true
System.out.println("a==b " + (a == b)); // true !!! look here
System.out.println("equals ->"  + a.equals(i)
                                + b.equals(i)
                                + a.equals(b)); // true, true, true

我不明白,为什么“真实”改为“假”?

1 个答案:

答案 0 :(得分:0)

与记忆有关

  

为了节省内存,Java'重用'所有包装器对象的值   属于以下范围:

     

所有布尔值(true和false)

     

所有字节值

     

从\ u0000到\ u007f的所有字符值(即十进制中的0到127)

     

从-128到127的所有短整数和整数值。

     

-128到127之间的长值。