在Java中:如果我将HashMap中的键更改为等于另一个键会发生什么
发布时间:2020-12-15 04:40:33 所属栏目:Java 来源:网络整理
导读:参见英文答案 Changing an object which is used as a Map key????????????????????????????????????5个 我知道我不能在HashMap中有两个相等的键(通过equals() – 方法).如果我尝试使用已存在的密钥向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的存储桶中搜索,并返回相应的值 – “另一个值”(除非两个键恰好映射到同一个存储桶,在这种情况下,可以返回任一值,具体取决于要测试的键首先是平等). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |