hashset 如何检查重复元素?

How hashset checks for duplicate elements?

请查看我的代码:

HashSet<A> set = new HashSet<A>();
for (int i = 0; i < 10; i++)
    set.add(new A());
System.out.println(set.contains(new A()));

Class A 定义为:

class A {
    public boolean equals(Object o) {
        return true;
    }    
    public int hashCode() {
        return (int) (Math.random()%100);
    }
}

如果hashset内部使用了hashmap……为什么输出是true? 因为不同的哈希码意味着它们的桶位置不同。 那么如何检查 new A() returns true .

此外,如果我 return 1 始终来自哈希码输出为真,这似乎没问题。

原因是你的哈希码函数:

(int) (Math.random()%100);

总是returns 0。所以所有 A 元素总是有相同的哈希码。因此,所有 A 元素都将位于 HashSet 中的同一个桶中,因为您的 equals 将始终 return 为真。一旦它在同一个桶中找到一个 A(在这种情况下总是如此),它就会 return 真的那个 A 已经被包含了。

Math.random() return 是一个介于 0 和 1 之间的数字,因此对任何事物取模将始终是 0

你可能想用 * 而不是 % 来获得 0 到 100 之间的随机数

 (int) (Math.random() * 100);

随心所欲

HashSet 对具有相同哈希桶的所有对象使用 equals() 来确定 contains()。因为 equals() 总是 true,新的 A 匹配哪个桶并不重要,但是所有对象都在同一个桶中,因为 (int)(Math.random() % 100) 总是 0.

尝试将哈希更改为:

(int)(Math.random() * 100)