为什么我的类在Java HashSet中无法正常工作?

时间:2009-12-01 16:44:09

标签: java collections hashset

我正在制作一个涉及我使用我制作的HashSet课程的项目,我将其命名为Test。我像这样定义了HashSet

HashSet<Test> t = new HashSet<Test>();
t.add(new Test("asdf", 1));
t.add(new Test("hello", 2));
t.add(new Test("hello", 3));

我尝试使用

t.contains(new Test("asdf", 1));

但它会返回false。但是,当我使用HashSet<Character>时,似乎工作正常。我试图覆盖之前的equals声明,但它没有用。我试图单独留下equals,但我还是false。我需要知道我做错了什么?

另外,我没有编辑哈希函数,我只更改了Test.equals(Object o)。这是一个简单的项目,因为java文档声明它使用了o.equals(this),我认为我不需要。

4 个答案:

答案 0 :(得分:5)

您可能还必须重载hashCode()方法。

答案 1 :(得分:4)

HashSet.add(Object data)不等于HashSet.add(new Test(String, int))

尝试使用HashSet.add(new Test("asdf", 1));。并使用hashCode()方法进行覆盖。你的代码是否编译?

答案 2 :(得分:3)

您的代码甚至无法编译......

HashSet没有add()方法,它接受两个参数。

如果你的意思是

t.add(new Test("asdf", 1));

代替

t.add("asdf", 1);

确保Test类的hashcode和equals方法正确实现,如前所述。

答案 3 :(得分:2)

在内部,哈希表将使用Object#hashCode()来散列和存储对象,如果存在hashCode冲突,则使用Object#equals()来测试相等性。您需要确保Test类提供合适的实现(覆盖),在您的情况下测试字符串相等性,否则默认的Object#equals()方法将使用对象实例标识(ref id)。有关此主题的教程,请参阅here