[英]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
之后不應該改變鍵(至少應該影響hashCode
和equals
的結果的屬性不應該被改變)。
至於不覆蓋equals
和hashCode
時的行為,在這種情況下, equals
asnd hashCode
不依賴於name
的值,因此更改name
沒有區別。 在這種情況下,如果您要搜索放入Map
的完全相同的Person
實例,則默認實現可確保您的密鑰可以在HashMap
找到。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.