作者:Not-Only-For曾广超 | 来源:互联网 | 2023-01-18 01:33
我知道我不能在HashMap中有两个相等的键(通过equals() - 方法).如果我尝试使用已存在的密钥向HashMap添加键值对,则旧值将被新值替换.
但是如果我将现有密钥更改为等于另一个现有密钥怎么办?
在这种情况下,map.get()方法将如何表现(应用于其中一个相等的键)?
下面非常简单的例子.
public class Person{
private int age;
private String name;
public Person(int a, String n){
age = a;
name = n;
}
public void setAge(int a){ age = a; }
public int getAge(){return age; }
public String getName() {return name; }
@Override
public boolean equals(Object o){
if(!(o instanceof Person)){return false;}
Person p = (Person) o;
return ((p.getName().equals(this.getName())) && (p.getAge() == this.getAge()));
}
@Override
public int hashCode(){return age;}
}
public class MainClass{
public static void main(String[]args){
Person p1 = new Person("Bill", 20);
Person p2 = new Person("Bill", 21);
HashMap map = new HashMap<>();
map.put(p1, "some value");
map.put(p2, "another value");
p1.setAge(21);
String x = map.get(p1); // <-- What will this be??
System.out.println(x);
}
}
Eran..
6
当你改变你已经存在的一个键时,HashMap
你就会破坏HashMap
.你不应该改变现有的密钥HashMap
.如果你必须改变这些键,你应该从HashMap
更改之前删除它们,并在更改之后put
再次删除它们HashMap
.
map.get(p1)
将p1
根据其新的搜索密钥,该密钥hashCode
等于哈希码p2
.因此,它将在包含的存储桶中进行搜索p2
,并返回相应的值 - "another value"
(除非两个键恰好映射到同一个存储桶,在这种情况下,可以返回任一值,具体取决于首先测试哪个键是否相等).
1> Eran..:
当你改变你已经存在的一个键时,HashMap
你就会破坏HashMap
.你不应该改变现有的密钥HashMap
.如果你必须改变这些键,你应该从HashMap
更改之前删除它们,并在更改之后put
再次删除它们HashMap
.
map.get(p1)
将p1
根据其新的搜索密钥,该密钥hashCode
等于哈希码p2
.因此,它将在包含的存储桶中进行搜索p2
,并返回相应的值 - "another value"
(除非两个键恰好映射到同一个存储桶,在这种情况下,可以返回任一值,具体取决于首先测试哪个键是否相等).