Java 比较包装整数对象

Java 比较包装整数对象,java,integer,Java,Integer,我正在用下面的代码比较两个Integer对象…为什么输出为“两个Integer都不相等…”尽管我已经读到Integer或int仅在-128到127范围内相等。为什么不呢 Integer i1 = 128; Integer i2 = 128; if(i1!=i2){ System.out.println("Both integer are not equal..."); } 整数是引用类型。它们不同于int,int是基本类型 ==运算符应用于引用类型时,会检查引用是否相等

我正在用下面的代码比较两个Integer对象…为什么输出为“两个Integer都不相等…”尽管我已经读到Integer或int仅在-128到127范围内相等。为什么不呢

Integer i1 = 128;
Integer i2 = 128;

    if(i1!=i2){
    System.out.println("Both integer are not equal...");

  }

整数是引用类型。它们不同于int,int是基本类型

==运算符应用于引用类型时,会检查引用是否相等。本质上,这意味着两个引用是==当且仅当它们引用内存中的同一对象时。.equals()运算符(i1.equals(i2))用于检查两个对象是否具有相同的值

但是,某些引用类型的某些预先存在的对象具有特定的值。如果编译器识别代码中的某些常量,它将指向预先创建的对象,而不是创建一个新对象来保存该常量。在下面的代码中,编译器不会为i1和i2创建新对象,而是将它们都设置为保存该值的预先存在的整数。因此i1和i2引用同一个对象,因此彼此为“==”

Integer i1 = 50;
Integer i2 = 50;
Integer i3 = new Integer(50);
Integer i4 = new Integer(50);
System.out.println("does i1==i2? " + (i1==i2));
System.out.println("does i1==i3? " + (i1==i3));
System.out.println("does i3==i4? " + (i1==i4));
将输出

does i1==i2? true
does i1==i3? false
does i3==i4? false

Java
Integer
是一种参考类型,
==
通常不适合进行比较

但是,对于较小的数字,Java实现了一种与自动装箱相连接的缓存机制,该机制使
=
操作符能够对-128到127范围内的数字正常工作

也就是说,如果你这样做了

Integer x = 12;
Integer y = 12;
boolean b = x==y;
b
将为
true

对于超出此范围的数字,它将不起作用。如果你这样做

Integer x = 200;
Integer y = 200;
boolean b = x==y;

b
将是
false
,因为这些数字是不指向同一对象的引用。

对于潜在的回答者:我相信问题是“为什么
整数
缓存只能从-128到127?”@user3580294:我已经走了这条路,并且被告知另一件事。@RobertHarvey其他事情?我要说的是OP的最后一句话……我应该指出这是JVM特有的。有-128+127正在关闭属性java.lang.Integer.IntegerCache.high。这是刚才看到的一部分,这是一个dup,另一个问题的答案基本相同,但更好地说明。。。废话!我不会说==在该范围内“正常”工作:相反,您可能会说它将等效于
等于
。在所有情况下,通过比较引用标识==都按照指定的方式工作(即,正确)。感谢用户2321368。答案似乎是我的一些新知识。。。