[英]HashMap with Object Key
我創建了一個HashMap
其中Object為Key,String為Value。 當我分配一個具有相同帳號的新對象(這是唯一鍵)並且我沒有插入我的HashMap
,我遇到問題,如果我得到它,則返回舊值而不是null。 我是Java HashMap
內部工作的新手。
class Main {
public static void main(String[] args) {
HashMap<Account, String> map = new HashMap<Account, String>();
Account a1 = new Account(1);
a1.setHolderName("A_ONE");
Account a2 = new Account(2);
a2.setHolderName("A_TWO");
map.put(a1, a1.getHolderName());
map.put(a2, a2.getHolderName());
a1.setHolderName("Defaulter");
a2.setHolderName("Bankrupt");
System.out.println(map.get(a1)); //Prints A_ONE
System.out.println(map.get(a2)); //Prints A_TWO
Account a3 = new Account(1);
a3.setHolderName("A_THREE");
System.out.println(map.get(a3)); //Prints value of a1 ??? WHY SO
}
}
public class Account
{
private int accountNumber;
private String holderName;
public Account(int accountNumber) {
this.accountNumber = accountNumber;
}
public String getHolderName() {
return holderName;
}
public void setHolderName(String holderName) {
this.holderName = holderName;
}
public int getAccountNumber() {
return accountNumber;
}
//Depends only on account number
@Override
public int hashCode() {
final int prime = 31;
int result = 13;
result = prime * result + accountNumber;
return result;
}
//Compare only account numbers
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Account other = (Account) obj;
if (accountNumber != other.accountNumber)
return false;
return true;
}
}
Expectation- map.get(a3)
應該為null
它不會導致你的期望,因為,等於方法的重寫尋求持有者名稱來測試。
試試下面的方法,
@Override
public boolean equals(Object o) {
if (o == this) return true;
if (!(o instanceof Account)) {
return false;
}
Account user = (Account) o;
return user.accountNumber == accountNumber &&
user.holderName.equals(holderName);
}
在覆蓋哈希碼和等於方法時,您需要注意某些點。 您可以在https://www.mkyong.com/java/java-how-to-overrides-equals-and-hashcode/上閱讀更多內容。
希望這會幫助你。
Map
任何合理實現(不僅僅是HashMap
)都會給你這個結果。 Map
存儲成對的鍵值。 當您get
某個鍵的值時,它會查看其中一個存儲的鍵是否等於給定的鍵並為您提供相應的值。 根據你對Map
的定義, a1
和a3
是相等的。 因此,當你執行map.get(a3)
你會得到a3
的值。
除此之外,在Map
使用它后更新密鑰並不是一個好主意。 雖然這不是一個真正的問題,但是如果更新方法hashCode
和equals
中使用的字段,它可能會產生不可預測的結果。
你做得很好:你已經一直覆蓋了equals
和hashCode
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.