Java 使用==和的奇怪包装器类行为=

Java 使用==和的奇怪包装器类行为=,java,wrapper,Java,Wrapper,可能重复: 最近,当我阅读包装器类时,我遇到了一个奇怪的情况: Integer i1 = 1000; Integer i2 = 1000; if(i1 != i2) System.out.println("different objects"); if(i1 == i2) System.out.println("same object"); 其中打印: different objects same object 及 其中打印: different objects same obje

可能重复:

最近,当我阅读包装器类时,我遇到了一个奇怪的情况:

Integer i1 = 1000;
Integer i2 = 1000;

if(i1 != i2) System.out.println("different objects");

if(i1 == i2) System.out.println("same object");
其中打印:

different objects
same object

其中打印:

different objects
same object
这个案子有什么合理的解释吗


感谢

对于第二种情况,
=
返回true的原因是包装器装箱的原语值足够小,可以在运行时保留为相同的值。因此他们是平等的

在第一种情况下,Java的整数缓存不够大,无法包含数字1000,因此您最终创建了两个不同的包装器对象,通过引用比较,结果返回false

所述缓存的使用可在
Integer#valueOf(int)
方法中找到(其中
IntegerCache.high
默认为127):

公共静态整数值(int i){
如果(i>=-128&&i整数i1=1000


编译器将其理解为int,这就是为什么
i1==i2//返回true

但是,
i1
i2
是big==测试返回false

Integer i1 = 10000000;
Integer i2 = 10000000;

if(i1 != i2) System.out.println("different objects"); // true

if(i1 == i2) System.out.println("same object"); // false
注意:

Integer i1 = 100;
Integer i2 = 100;

System.out.println(i1 == i2); // true

i1 = 1000000;
i2 = 1000000;

System.out.println(i1 == i2); // false
不要用==测试对象的相等性。它只是比较它们的引用。
.equal()
检查两个对象是否相同

Integer i1 = 1000000;
Integer i2 = 1000000;

i1 == i2 // false
i1.equals(i2) // true

我刚试过这个,它给我留下的只是

different objects
正如预期的那样,因为您正在创建两个不同的包装器对象,即使它们碰巧包含相同的值

正如琥珀色在上述评论中暗示的那样

if(i1.equals(i2)) System.out.println("same value");
确实是印刷品

same value

这就是
.equals()
存在的原因。它似乎打破了各种不变量。你确定你读对了吗?你能重现它吗?我只是想对此进行进一步确认。你确定吗?我刚刚尝试过这个,我的程序输出是“不同的对象”这就是我所期望的?您是否输入了错误?您使用的是什么jvm以及什么系统?好的,现在您的编辑有意义了。我取消了删除我的答案。您是否实际编译并运行了此代码?它没有做您所声称的事情。“编译器将其理解为整数,这就是为什么i1==i2//返回true”这没有任何意义,因为如果你尝试过,例如700,它会给你不同的对象不是这么小的值我是说int是一个简单的数据类型不是object,所以它是运行库,它有一个字节值范围的缓存,而不是JVM的内存“Java的整数缓存不够大,无法包含数字1000,因此最终会创建两个不同的包装器对象"etcSo,当i1和i2的值都在-128和127之间时,i1==i2返回true,否则返回false。Downvote?为了什么?我编译并运行了代码,这就是我看到的。我刚刚尝试了这个,它为我打印的所有内容都是
这不是真的。尝试给出范围
-127
的值,它将作为同一个对象打印。不同的Java版本?两年过去了,我不知道我当时在运行什么!