【发布时间】:2020-07-13 06:57:22
【问题描述】:
我有以下代码
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
public class Person {
private String name;
private long birthTime;
@Override
public int hashCode() {
return Objects.hash(name, birthTime);
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (!(obj instanceof Person)) {
return false;
}
Person other = (Person) obj;
return Objects.equals(name, other.name)
&& birthTime == other.birthTime;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public long getBirthTime() {
return birthTime;
}
public void setBirthTime(long birthTime) {
this.birthTime = birthTime;
}
public static Person person(String name, long time) {
Person p = new Person();
p.setName(name);
p.setBirthTime(time);
return p;
}
public static void main(String[] args) {
Map<Person, Person> map = new HashMap<>();
Person p = person("alice", 3);
System.out.println("1. " + map.containsKey(p));
map.put(p, p);
System.out.println("2. " + map.containsKey(p));
p.setName("charlie");
System.out.println("3. " + map.containsKey(p));
Person p2 = person("alice", 3);
System.out.println("4. " + map.containsKey(p2));
Person p3 = person("charlie", 3);
System.out.println("5. " + map.containsKey(p3));
}
}
我期望输出为假、真、真、假和真。 但是,输出是假,真,假,假,假。
我正在寻找第 3 种和第 5 种情况的输出如何为假。 HashMap containsKey 的行为是什么?
为什么即使 Key 对象存在于 Map 中,输出仍为 false。 Person 类的 equals 和 hashcode 方法都被覆盖了。
【问题讨论】:
-
“不得不添加很多多余的细节,因为内容小于代码,所以不允许我这样做。”除此之外,我在这里没有看到任何多余的东西,如果您在没有文本的情况下提供了代码,那么这个问题将很难理解。虽然您的代码可以通过基本上只进行 一个 检查(或者可能一个具有预期结果,一个具有意外结果)而不是五个来缩短。
-
由于这个原因,在 HashMaps 中用作键的类应该是不可变的
标签: java hashmap containskey