微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

参见英文答案 > Changing an object which is used as a Map key                                    5个
我知道我不能在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);  
 }

}

解决方法

当您改变HashMap中已存在的键时,您将破坏HashMap.你不应该改变HashMap中存在的键.如果必须改变这些键,则应在更改之前将其从HashMap中删除,并在更改后将它们再次放入HashMap中.

map.get(p1)将根据其新的hashCode搜索密钥p1,该hashCode等于p2的哈希码.因此,它将在包含p2的存储桶中搜索,并返回相应的值 – “另一个值”(除非两个键恰好映射到同一个存储桶,在这种情况下,可以返回任一值,具体取决于要测试的键首先是平等).

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐