代码:
Integer a1 = 127; Integer b1 = 127; if(a1==b1){ System.out.println("相等"); }else{ System.out.println("不等"); } Integer a = 128; Integer b = 128; if(a==b){ System.out.println("相等"); }else{ System.out.println("不等"); }运行结果是:
相等
不等
测试了下,两个Integer大于或等于128时是不等的。
这是怎么回事?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
这个现象是由于Java中的Integer类的缓存机制导致的。在Java中,为了提高性能和减少对象创建的开销,Integer
类维护了一个内部缓存池(-128到127之间的值),对于这个范围内的整数,Integer.valueOf(int)
方法会直接从缓存池中返回已经存在的Integer
对象,而不是每次调用都新建一个对象。
在你的代码中:
对于Integer a1 = 127;
和 Integer b1 = 127;
,因为127在缓存范围内,a1
和b1
指向的是同一个缓存中的Integer
对象,所以a1==b1
比较的是两个对象引用是否相同,结果为真,输出“相等”。
而对于Integer a = 128;
和 Integer b = 128;
,因为128超出了缓存范围,每次通过new Integer(128)
或者直接赋值都会创建一个新的Integer
对象。因此,即使a
和b
的值相同,它们也是两个不同的对象,在内存中有不同的地址,所以a==b
比较的是对象引用,结果为假,输出“不等”。
注意,这里使用的是==
操作符,它比较的是对象的引用是否相同,而不是对象的内容(即值)是否相等。如果你想比较两个Integer
对象的值是否相等,应该使用.equals()
方法,如a.equals(b)
,这将比较它们所封装的int值是否相等。