请查看我的代码:
HashSet<A> set = new HashSet<A>();
for (int i = 0; i < 10; i++)
set.add(new A());
System.out.println(set.contains(new A()));
A类定义为:
class A {
public boolean equals(Object o) {
return true;
}
public int hashCode() {
return (int) (Math.random()%100);
}
}
如果hashset在里面使用hashmap ......为什么输出为true? 因为不同的哈希码意味着它们的桶位置不同。 那么检查新的A()如何返回true。
此外,如果我总是从哈希码输出返回1是真的,这似乎没问题。
答案 0 :(得分:4)
原因是你的哈希码函数:
(int) (Math.random()%100);
始终返回0
。因此,所有A
元素始终具有相同的哈希码。因此,所有A元素都将位于HashSet的同一个桶中,因此您的equals将始终返回true。一旦它在同一个桶中找到A(在这种情况下总是),它将返回true,表明A已被包含。
Math.random()
会返回0到1之间的数字,因此模数将始终为0
。
您可能需要*
代替%
来获取0到100之间的随机数
(int) (Math.random() * 100);
你想做什么
答案 1 :(得分:1)
HashSet
在具有相同哈希桶的所有对象上使用equals()
来确定contains()
。由于equals()
始终为true
,因此新A
匹配哪个存储桶无关紧要,但所有对象都位于同一存储桶中,因为(int)(Math.random() % 100)
始终为{{1} }}
尝试将哈希值更改为:
0