为什么==对于一些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,因为它是与==关系运算符的引用比较。 但是第三次打印给出了错误,我不理解这种不一致。
解释非常感谢!
在第一种情况下,对象i
和j
都指向相同的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 i
和Integer j
保存整数范围内的整数值,整数范围是-128 to 128
, Integer n
和Integer m
超出Integer
范围