簡體   English   中英

hashmap對象引用如何更改

[英]how hashmap object reference change

試圖檢查hashmap的工作原理

public class hashmapcheck {
public static void main(String args[]) {
    Person abhishek = new Person("abhishek");
    Map<Person,String> mapCheck = new HashMap<Person,String>();
    mapCheck.put(abhishek,"ancd");
    abhishek.setName("defg");
    System.out.println(mapCheck.get(abhishek));  //line which i try to undertand
}

}

public class Person {
public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public Person(String name) {
    this.name = name;
}

String name;

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;

    Person person = (Person) o;

    return name != null ? name.equals(person.name) : person.name == null;
}

@Override
public int hashCode() {
    return name != null ? name.hashCode() : 0;
}

}

如果對於person類沒有覆蓋equals和hashcode,則它會打印ancd,但是當我覆蓋它時,它將打印null。 當我存儲objectin hashmap時我會想到它將存儲該hashmap的引用出錯的地方

在將其添加到HashMap之后, abhishek.setName("defg")正在改變HashMap一個鍵( Person實例)。

這會導致該鍵的hashCode()發生更改,因此get()方法無法根據新的hashCode()找到它(因為它被放置在與原始hashCode()匹配的bin中。

您濫用HashMap類。 在添加到HashMap之后不應該改變鍵(至少應該影響hashCodeequals的結果的屬性不應該被改變)。

至於不覆蓋equalshashCode時的行為,在這種情況下, equals asnd hashCode不依賴於name的值,因此更改name沒有區別。 在這種情況下,如果您要搜索放入Map的完全相同的Person實例,則默認實現可確保您的密鑰可以在HashMap找到。

暫無
暫無

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

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