Java 为什么有些整数对象的==为真?

Java 为什么有些整数对象的==为真?,java,integer,Java,Integer,可能重复: 我已从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

可能重复:

我已从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的值的对象。(实现规范可能会告诉您一些细节)。这可能是为了节省内存(接近0的值很常见,为每个具有相同值的变量创建一个新对象将浪费大量内存)


==
检查两个事物是否为同一对象;对于具有相同值的任意两个给定变量,可以拥有或不拥有相同的整数对象。你不应该检查
=
,因为你不应该关心它是否是同一个对象;重要的是
整数的值,而不是它的标识。

在第一种情况下,对象
i
j
都指向同一个缓存对象。默认情况下,-128到127之间的范围缓存为
Integer
对象。我们可以使用

增加范围有关缓存的答案是正确的。然而,如果你去

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

…然后您将避免缓存,结果将是您所期望的。

在本例中,
整数i
整数j
包含整数范围内的整数值,
整数的范围是
-128到128
,而且
整数n
整数m
超出了
整数

+1的范围,有趣的是,我不知道它是可配置的。我也不知道它是可配置的。根据、、@pst,从-128到127的自动装箱值必须是等同的。感谢您的编辑。在我的角落打字有点尴尬。