代码:
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值是否相等。