错误案例
【现象描述】 里面判断容器应该要包含的对象,实际上却没有
【错误代码】
class T {
private String str;
T(String str) {
this.str = str;
}
public boolean equals(Object obj) {
if(!(obj instanceof T)){
return false;
}
T t = (T)obj;
return t.equals(this.str);
}
//这里没有覆写hashCode方法
public static void main(String[] args) {
Set set = new HashSet();
set.add(new T("str"));
System.out.println(set.contains(new T("str")));//false
}
}
错误分析
HashMap和HashSet获取value是通过传入的object的hashcode在内存中找地址,如果存在对应的value,就把地址对应的value返回。
contains是通过传入的object的hashcode在内存中找地址,将传入的object和对应地址上的value通过equals方法比较,如果相等就返回true,否则false。
如果new一个object作为key去拿value是永远得不到结果的,因为每次new一个object,这个object的hashcode是永远不同的,所以我们要重写hashcode。
所以,在这个例子中在覆写equals这个方法的同时,还要覆写hashCode方法。
正确用法
class T {
private String str;
T(String str) {
this.str = str;
}
public boolean equals(Object obj) {
if(!(obj instanceof T)){
return false;
}
T t = (T)obj;
return t.equals(this.str);
}
//同时要覆写hashCode方法
public int hashCode() {
int hash = 0;
if(str!=null){
for(char c: str.toCharArray()){
hash +=c;
}
}
return hash;
}
}
本文通过一个错误案例展示了在Java中正确使用equals方法和hashCode方法的重要性。当对象用于集合类如HashSet时,若未同步覆写这两个方法,则会导致无法正确判断对象是否已存在于集合中。文章详细解释了原因,并提供了正确的实现方式。

被折叠的 条评论
为什么被折叠?



