为什么==对于一些Integer对象来说是正确的?

可能重复:
整数包装对象只在值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 } } 

上面的程序给第一个打印语句输出true,但是它应该是false,因为它是与==关系运算符的引用比较。 但是第三次​​打印给出了错误,我不理解这种不一致。

解释非常感谢!

在第一种情况下,对象ij都指向相同的caching对象。 默认情况下,-128到127之间的范围被caching为Integer对象。 我们可以使用JVM arguments来增加范围

关于caching的答案是正确的。 但是,如果你去…

 Integer i = new Integer(10); Integer j = new Integer(10); 

…然后你避免caching,结果将是你所期望的。

整数对象可以caching为表示值接近0的值。(实现规范可能会告诉你一些细节)。 这大概是为了节省内存(值接近0是常见的,并且会浪费大量的内存来为具有相同值的每个variables创build新的对象)。

==检查两件事是否是同一个对象; 对于任何两个具有相同值的给定variables,您可能也可能不具有相同的Integer对象。 你不应该用==来检查,因为你不应该关心它是否是同一个对象; Integer的价值是重要的,而不是它的身份。

在这种情况下, Integer iInteger j保存整数范围内的整数值,整数范围是-128 to 128Integer nInteger m超出Integer范围