public static void main(String[] args) {
Integer p = 10000;
Integer q = 10000;
System.out.println(p == q);
System.out.println(p.equals(q));
}
---------------------运行结果----------------------
false
true
结果分析:
- Integer的缓存还记吗?10000太大,常量池的缓存只存了-128到127。所以p != q。
- Integer等数值型重写了equals方法(见下面源代码),使得Integer的equals方法比较的是值,而不是内存地址,就像字符串String一样。
/**
* 源码
* A.equals(B) 比较两个对象A和B。
* 当且仅当B非空,而且B是个值和A的值相等的Integer对象时,A和B相等。
*/
public boolean equals(Object obj) {
if (obj instanceof Integer) { //instanceof判断obj是否是Integer的一个实例对象
return value == ((Integer)obj).intValue();
}
return false;
}