[英]How hashCode works in Java
我有一個Employee
類,並且我覆蓋了hashCode()
方法,而不是equals()
方法。
public class Employee {
public int id;
public String name;
public Employee (int id, String name) {
this.id = id;
this.name = name;
}
@Override
public int hashCode() {
return name.hashCode();
}
}
現在,客戶端添加了3個數據,其中hashCode()
相同。
public class EmployeeTest {
public static void main(String...args) {
Employee emp1 = new Employee(11, "Arunan");
Employee emp2 = new Employee(22, "Arunan");
Employee emp3 = new Employee(33, "Arunan");
HashMap<Employee,Employee> map = new HashMap<>();
map.put(emp1, emp1);
map.put(emp2, emp2);
map.put(emp3, emp3);
Employee emp = map.get(emp3);
System.out.println(emp.id);
}
}
現在,根據我的理解,以上3個對象將最終在hashmap中的同一存儲桶中。 由於未實現equals()
,因此HashMap很難識別特定對象。 但是在上面的程序中,我得到了emp3對象,它正確地獲取了emp3對象。 哈希圖如何工作?
您對它們最終出現在相同存儲桶中是正確的。
在沒有覆蓋的equals
方法的情況下,JVM只會比較對象引用的相等性。
在您的情況下,您將與放置在地圖中的對象傳遞給map.get()
,因此引用將相等,因此它與對象匹配。
嘗試創建:
Employee emp3CantFindMe = new Employee(33, "Arunan")
您會發現嘗試從地圖中檢索出來的結果將為null,即使它似乎與emp3
相同。
如果兩個對象實際上是同一對象,則equals()
默認實現返回true。 並且在您的情況下,您使用放emp3
的同一對象( emp3
)查詢哈希圖。 這就是為什么它起作用。
HashMap首先使用hashCode
查找可能的候選對象,然后使用equals
查找所需的實際對象。 即使是良好的hashCode
實現,也必然會發生無法忽略的沖突。 因此,如果這些沖突經常發生,則必須使用具有相同hashCode的不相等對象可能會降低性能,但不會破壞語義。 另一種方法(具有相同的對象但具有不同的hashCode)確實破壞了語義。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.