簡體   English   中英

hashCode的實現和自定義對象的equals,用作HashMap中的鍵

[英]Implementation of hashCode and equals of a custom object to use as a key in HashMap

據我所知,如果我們想在HashMap使用object作為鍵,我們需要實現hashCodeequals方法(在該類上)才能正常工作。 但是在下面的代碼中我使用了對象作為鍵,但沒有在Employee類上實現上面兩個方法,並且它工作正常。

你能否澄清為什么沒有hashCodeequals

public class Employee1 {
    Integer Roll;
    String Name;
    int age;

    Employee1(int roll,String name,int Age)
    {
            this.Roll =roll;
            this.Name= name;
            this.age =Age;
    }
}

public static void main(String ar[]) {
    Map<Employee, Integer> ObjectAsKeyMap = new HashMap<Employee, Integer>();
    Employee e1 = new Employee(10, "Samad", 30);
    Employee e2 = new Employee(50, "Sahar", 20);
    ObjectAsKeyMap.put(e1, 10);
    ObjectAsKeyMap.put(e2, 20);
    if (ObjectAsKeyMap.containsKey(e1))
        System.out.println("this Object is already present in HashMap Value="+ObjectAsKeyMap.get(e1));
}

輸出:

this Object is already present in HashMap Value=10

equals(Object o)的默認實現是this == o 由於您使用對象作為鍵,然后使用相同的實例來查詢映射,因此它可以工作。 但是,如果您創建了Employee e3 = new Employee (10, "Samad", 30) ,即使邏輯上它應該等於e1 ,它也不會有效,因為您沒有實現hashCode()equals(Object)按要求。

規則不是必須覆蓋equals()hashCode() 規則是,如果你覆蓋一個,你必須覆蓋另一個。 此外,確保密鑰是不可變的 ,否則如果在添加到地圖后修改密鑰,則無法找到密鑰。

另外一個重要的一點是,您應該使用相同的字段來計算您在equals()使用的hashCode

Object類中equals()hashCode()的默認實現已經滿足這些方法的約定。

Object的默認equals方法返回true (和相同的hashCode ),如果它是相同的對象引用,並且您沒有在Employee覆蓋它們。 您正在提供與HashMap已有的對象引用相同的對象引用e1 ,因此containsKey(e1)返回true 如果您要創建一個單獨的Employee對象e3 ,其屬性與e1相同,那么containsKey(e3)將返回false除非您在Employee正確覆蓋equalshashCode

Object類已經包含hashCodeequals ,這些在HashMap工作正常。 但是,您將獲得的行為是比較同一個對象 ,而不是兩個不同的對象是否相同。

最重要的規則是,如果你這樣做覆蓋equals ,你需要重寫hashCode ,這樣是“平等”的對象有相同hashCode (這意味着equals法需要比較所有的字段hashCode用於構建它的價值) 。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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