我正在尝试了解 HashMap put 行为,但我对下面的场景有点困惑。下面是我将在 HashMap 中用作键的类之一的实现
class Person {
int id;
String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + "]";
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + id;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Person other = (Person) obj;
if (id != other.id)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}
出于测试目的,我有一个 util 方法
public void displayMap() {
Person person = new Person();
person.setId(1);
person.setName("praveen");
Map<Person, String> mapPerson = new HashMap<>();
mapPerson.put(person, "");
person.setId(2);
person.setName("praveen");
mapPerson.put(person, "");
System.out.println(mapPerson);
}
我预计输出为{Person [id=1, name=praveen]=, Person [id=2, name=praveen]=}
但我将其视为 {Person [id=2, name=praveen]=, Person [id=2, name=praveen]=}
.
我使用同一个 person 对象作为键插入多次,但具有不同的 id 值。但据我了解,如果 key 相同,理想情况下应该用新 key 替换现有 key 。但我看到的是 Id=2 且 name=praveen 的人多次显示。这不是重复key并且违反了具有重复key的hashmap原则吗?为什么显示{Person [id=2, name=praveen]=, Person [id=2, name=praveen]=}
不是{Person [id=1, name=praveen]=, Person [id=2, name=praveen]=}
最佳答案
来自 map Javadoc:
Note: great care must be exercised if mutable objects are used as map keys. The behavior of a map is not specified if the value of an object is changed in a manner that affects equals comparisons while the object is a key in the map.
该指令的摘要:永远,永远修改您刚刚作为 map 键放入的内容,糟糕的事情将会发生,并且没有办法告诉会发生什么糟糕的事情。
您修改了作为 map 键放入的内容,基本上就发生了不好的事情。
您应该为第二次插入启动一个新 Person
对象,然后事情就会正常正确地发生。
关于java - 理解Hashmap put方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44687923/