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

yag*_*nya 19 java 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
    }
}      
Run Code Online (Sandbox Code Playgroud)

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

非常感谢您的解释!

Pri*_*ley 34

在第一种情况下,两个物体ij被指向同一高速缓存的对象.默认情况下,-128和127之间的范围将缓存为IntegerObject.我们可以使用增加范围JVM arguments

  • +1有趣,不知道那是可配置的. (5认同)
  • 我也不知道它是可配置的.根据[JLS 5.1.7](http://java.sun.com/docs/books/jls/third_edition/html/conversions.html#5.1.7),-128到127*的自动装箱值必须*相同. ) (3认同)

use*_*300 12

关于缓存的答案是正确的.但是,如果你去......

Integer i = new Integer(10);
Integer j = new Integer(10);
Run Code Online (Sandbox Code Playgroud)

...然后你避免缓存,结果将是你所期望的.


Kar*_*tel 8

可以为表示接近0的值的高速缓存整数对象.(实现的规范可能会告诉您一些细节).这可能是为了节省内存(接近0的值是常见的,并且它会浪费大量内存来为具有相同值的每个变量创建一个新对象).

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