反例:
在判断两个List是否相等时,我写出了如下代码
该代码通过了绝大多数用例,直到有一个用例中出现了 200 这个整型报错了。
if(res1.size() != res2.size()) return false;
for(int i = 0; i < res1.size(); i++){
if(res1.get(i) != res2.get(i)){
return false;
}
}
return true;
将判断条件改为如下代码就好了:
if(!res1.get(i).equals(res2.get(i))){
return false;
}
原理:
包装类型的缓存机制!!,非常常规的一个八股
Byte,Short,Integer,Long 这 4 种包装类默认创建了数值 [-128,127] 的相应类型的缓存数据,Character 创建了数值在 [0,127] 范围的缓存数据,Boolean 直接返回 True or False。
正例:
1、使用equals()来比较对象值的相等关系
以下是Integer中重写的equals代码
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
2、直接使用equals()来比较两个集合的相等关系
return res1.equals(res2);
AbstractList封装好的源码如下:
@Override
public boolean equals(Object o) {
if (o == this)
return true;
if (!(o instanceof List))
return false;
List<?> other = (List<?>) o;
if (size() != other.size())
return false;
Iterator<?> e1 = iterator();
Iterator<?> e2 = other.iterator();
while (e1.hasNext()) {
Object o1 = e1.next();
Object o2 = e2.next();
if (!Objects.equals(o1, o2))
return false;
}
return true;
}
总结:
针对对象值的比较一定要使用equals!!