在 Java 中:如果我将 HashMap 中的一个键更改为等于另一个键,会发生什么情况?
In Java: What happens if I change a key in an HashMap to be equal to another key?
我知道我不能在 HashMap 中有 2 个相等的键(通过 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<Person, String> 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);
}
}
当您更改 HashMap
中已经存在的密钥时,您会破坏 HashMap
。您不应该改变 HashMap
中存在的键。如果您必须改变这些键,您应该在更改前从 HashMap
中删除它们,并在更改后的 HashMap
中再次 put
它们。
map.get(p1)
会根据其新的hashCode
寻找keyp1
,等于p2
的哈希码。因此它将在包含 p2
和 return 的桶中搜索相应的值 - "another value"
(除非两个键碰巧映射到同一个桶,在这种情况下,任何一个值都可以是returned,取决于首先测试哪个键是否相等)。
简而言之:p1 将无法再访问。
一般来说,map是使用散列函数将键拆分到桶中,然后使用相等函数来定位正确的键值。当您更改 p1
的值及其哈希值时。如果您要查找它,地图将在不同的存储桶中查找值并且不会看到它,并且地图中的 p1
将无法访问。
我知道我不能在 HashMap 中有 2 个相等的键(通过 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<Person, String> 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);
}
}
当您更改 HashMap
中已经存在的密钥时,您会破坏 HashMap
。您不应该改变 HashMap
中存在的键。如果您必须改变这些键,您应该在更改前从 HashMap
中删除它们,并在更改后的 HashMap
中再次 put
它们。
map.get(p1)
会根据其新的hashCode
寻找keyp1
,等于p2
的哈希码。因此它将在包含 p2
和 return 的桶中搜索相应的值 - "another value"
(除非两个键碰巧映射到同一个桶,在这种情况下,任何一个值都可以是returned,取决于首先测试哪个键是否相等)。
简而言之:p1 将无法再访问。
一般来说,map是使用散列函数将键拆分到桶中,然后使用相等函数来定位正确的键值。当您更改 p1
的值及其哈希值时。如果您要查找它,地图将在不同的存储桶中查找值并且不会看到它,并且地图中的 p1
将无法访问。