【发布时间】:2019-10-19 03:18:02
【问题描述】:
我一直在试图了解 HashSet 的行为方式,但我遇到了这个我无法理解的问题。第 2 个和第 3 个狗对象具有相同的名称,并且 equals() 和 hashcode() 已被覆盖以使名称意味着相等。尽管如此,hashSet 仍然有重复,我不知道为什么。
我重读了 Head First Java 的数据结构章节,但它仍然表明我的代码应该在理论上可以工作。
public class DataStructsTests<E> {
HashSet<Dogs> tree = new HashSet<Dogs>();
HashSet<Dogs> treeOwner = new HashSet<Dogs>();
public static void main(String[] args) {
DataStructsTests<String> d = new DataStructsTests<String>();
d.go();
}
public void go() {
Dogs dog = new Dogs("Scout", "a");
tree.add(dog);
treeOwner.add(dog);
Dogs dog2 = new Dogs("Brodie", "b");
tree.add(dog2);
treeOwner.add(dog2);
Dogs dog3 = new Dogs("Brodie", "c");
tree.add(dog3);
treeOwner.add(dog3);
System.out.println(tree);
System.out.println(treeOwner);
System.out.println(dog2.equals(dog3));
System.out.println(dog2.hashCode() + " " + dog3.hashCode());
}
class Dogs {
private String name;
private String ownerName;
public Dogs(String n, String o) {
name = n;
ownerName = o;
}
public boolean equals(Dogs d) {
return name.equals(d.getName());
}
public int hashCode() {
return name.hashCode();
}
public String getName() {
return name;
}
public String toString() {
return name;
}
运行程序会返回:
[Brodie, Brodie, Scout]
[Brodie, Brodie, Scout]
true
1998211617 1998211617
即使 equals() 返回 true 并且哈希码相同,但仍然存在重复项。
编辑:原来问题在于我没有正确覆盖 equals() 方法,因为我使用的是 Dog 而不是 Object。
【问题讨论】:
-
您尚未覆盖
equals方法。它必须有一个Object类型的参数才能被覆盖。这只是一个过载。 -
这就是为什么您应该始终在实际尝试覆盖时将
@Override添加到方法中。
标签: java equals hashset hashcode