我创建了一个HashMap
,其对象为键,字符串为值。当我分配一个具有相同帐号(这是唯一键)的新对象并且没有插入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;
}
}
期望-map.get(a3)
应该为null
答案 0 :(得分:0)
这不会引起您的期望,因为,“等于方法”的重载将寻求持有人的姓名进行测试。
尝试以下方法,
@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);
}
在覆盖哈希码和equals方法时,需要注意某些要点。您可以在https://www.mkyong.com/java/java-how-to-overrides-equals-and-hashcode/
上阅读更多内容希望这会对您有所帮助。
答案 1 :(得分:0)
任何合理的Map
实现(不仅是HashMap
)都会为您带来这一结果。 Map
存储密钥对值。当您get
的键值时,它将查看存储的键之一是否等于给定的键,并为您提供相应的值。根据您对Map
的定义,a1
和a3
相等。因此,当您执行map.get(a3)
时,将获得a3
的值。
除此之外,在Map
中使用密钥后更新密钥不是一个好主意。尽管这不是一个真正的问题,但是如果您更新方法hashCode
和equals
中使用的字段,它可能会产生不可预测的结果。
您做得很好:您始终覆盖equals
和hashCode
。