在Java中:如果我将HashMap中的键更改为等于另一个键会发生什么?

时间:2017-09-18 10:57:06

标签: java hashmap equals

我知道我不能在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<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);  
 }

}

2 个答案:

答案 0 :(得分:6)

当您改变HashMap中已存在的密钥时,您会破坏HashMap。你不应该改变HashMap中存在的密钥。如果您必须改变此类密钥,则应在更改前将其从HashMap删除,并在更改后put再次HashMap

map.get(p1)将根据新p1搜索密钥hashCode,该密钥等于p2的哈希码。因此,它将在包含p2的存储区中进行搜索,并返回相应的值 - "another value"(除非两个键恰好映射到同一个存储区,在这种情况下,可以返回任一值,具体取决于首先测试哪个密钥是否相等)。

答案 1 :(得分:1)

简而言之:p1将无法再访问。

通常,映射使用散列函数将键分割为存储桶,然后使用相等的函数来定位正确的键值。当您更改p1的值并使用其哈希值时。如果您要查找它,地图将在另一个存储桶中查找该值,但不会看到它,并且无法访问地图中的p1