首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用==和!=的奇怪包装类行为

使用==和!=的奇怪包装类行为
EN

Stack Overflow用户
提问于 2011-01-09 06:45:58
回答 3查看 789关注 0票数 3

可能重复:

Weird Java Boxing

最近,当我读到包装类的时候,我经历了一个奇怪的例子:

代码语言:javascript
复制
Integer i1 = 1000;
Integer i2 = 1000;

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

if(i1 == i2) System.out.println("same object");

其中的指纹:

代码语言:javascript
复制
different objects

代码语言:javascript
复制
Integer i1 = 10;
Integer i2 = 10;

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

if(i1 == i2) System.out.println("same object");

其中的指纹:

代码语言:javascript
复制
same object

这个案子有什么合理的解释吗?

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-01-09 06:50:30

对于第二种情况,==返回true的原因是包装器封装的原始值足够小,可以在运行时将其嵌入到相同的值中。所以他们是平等的。

在第一种情况下,Java的整数缓存不足以包含数字1000,因此您最终创建了两个不同的包装器对象,通过引用返回false。

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

代码语言:javascript
复制
public static Integer valueOf(int i) {
    if(i >= -128 && i <= IntegerCache.high)
        return IntegerCache.cache[i + 128];
    else
        return new Integer(i);
}

正如Amber所说,如果您使用.equals(),那么这两种情况都会不可避免地返回true,因为在必要的地方,它会解压缩它们,然后比较它们的原始值。

票数 9
EN

Stack Overflow用户

发布于 2011-01-09 06:52:13

整数i1 = 1000;

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

但是当i1i2是大的==测试时,返回错误

代码语言:javascript
复制
Integer i1 = 10000000;
Integer i2 = 10000000;

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

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

注意事项:

代码语言:javascript
复制
Integer i1 = 100;
Integer i2 = 100;

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

i1 = 1000000;
i2 = 1000000;

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

不要用==测试对象的相等性。只是比较了他们的参考资料。.equal()检查两个对象是否相同。

代码语言:javascript
复制
Integer i1 = 1000000;
Integer i2 = 1000000;

i1 == i2 // false
i1.equals(i2) // true
票数 1
EN

Stack Overflow用户

发布于 2011-01-09 06:55:38

我刚试了一下,所有的指纹都是

代码语言:javascript
复制
different objects

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

正如Amber在上述评论中所暗示的,

代码语言:javascript
复制
if(i1.equals(i2)) System.out.println("same value");

真的打印

代码语言:javascript
复制
same value
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4638023

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档