改编自http://www.blogjava.net/zhangyuan/archive/2010/07/24/327011.html
有删改,侵权请联系删除
两个Integer
类型值比较是否相等的问题:
public class Test {
/**
* 关于Integer大小比较问题
*/
public static void main(String[] args) {
Integer a = 10;
Integer b = 10;
System.out.println("a==b : " + String.valueOf(a == b));
System.out.println("a.equals(b) : " + String.valueOf(a.equals(b)));
}
}
//输出:
//a==b : true
//a.equals(b) : true
但是当a
、b
的值变得足够大(小)之后:
public class Test {
/**
* 关于Integer大小比较问题
*/
public static void main(String[] args) {
Integer a = 1000;
Integer b = 1000;
System.out.println("a==b : " + String.valueOf(a == b));
System.out.println("a.equals(b) : " + String.valueOf(a.equals(b)));
}
}
//输出:
//a==b : false
//a.equals(b) : true
问题:为什么两个Integer
类型的值变得足够大(小)之后,他们就不再“相等了”?
解答:
- 对
a
、b
赋值时,Integer
类调用public static Integer valueOf(int i)
这个方法:
public static Integer valueOf(int i) {
if (i >= -128 && i <= IntegerCache.high)
return IntegerCache.cache[i + 128];
else
return new Integer(i);
}
==
在比较对象的时候是比较的内存地址,而对于原始数据类型是直接比对的数据值。Integer
在赋值时,在-128<=i
<=127的时候是直接用的int
原始数据类型,而超出了这个范围则是new
了一个对象。
因此第一二次的结果不同。