簡體   English   中英

hashCode如何在Java中工作

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM