0

我正在从事一个项目,该项目涉及我使用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。但是,当我使用 a 时HashSet<Character>,它似乎工作正常。我尝试覆盖先前的equals声明,但没有奏效。我试着equals独自离开,但我仍然得到false。我需要知道我做错了什么?

另外,我没有编辑散列函数,我只更改了 Test.equals(Object o)。这是一个简单的项目,由于 java 文档声明它使用 o.equals(this),我想我不必这样做。

4

4 回答 4

5

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

于 2009-12-01T16:47:50.187 回答
4

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

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

于 2009-12-01T16:50:12.330 回答
3

你的代码甚至不会编译...

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

如果你的意思是

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

代替

t.add("asdf", 1);

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

于 2009-12-01T17:07:27.387 回答
2

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

于 2009-12-01T16:49:39.977 回答