java开发中经常会用到equals方法,String,Integer等,都重写了Object的equals方法,下面了解一下开发中易犯的错误。
1. String的equals(object)方法,如果object不是String类型则返回false。
这个错误在某些不是很明显的情况下,很容易被忽视,例如map中get到对象来比较。
示例:
Map<String,Object> map = new HashMap<>();
map.put("A", "112");
map.put("B", 112);
System.out.println("112".equals(map.get("A")));//true
System.out.println("112".equals(map.get("B")));//false
map里面get到的B对象不是String类型,使用equals是达不到预期结果的,所以需要将
map.get("B").toString()
,确保equals中的对象是对应的String类型。
稍一看源码就很明了
:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String) anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
2. Integer的equals(obj)方法,同样obj不是Integer类型的话,是不能达到预期效果的。
实际上Integer的equals(obj)方法是将obj转换为基本类型int后,用‘==’来比较;
所以在编码时不必使用equals方法,直接用.intValue()方法转换后,用‘==’来比较;
源码了解一下:
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}