我正在制作一个涉及我使用我制作的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),我认为我不需要。
答案 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。