hashset如何检查重复元素?

时间:2015-05-17 04:08:00

标签: java equals hashcode hashset

请查看我的代码:

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是真的,这似乎没问题。

2 个答案:

答案 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