错误案例
【现象描述】里面判断容器应该要包含的对象,实际上却没有
【错误代码】
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; } }