【发布时间】:2017-12-04 19:19:11
【问题描述】:
这个example 看起来很简单:
HashSet<Integer> hSet = new HashSet<Integer>();
hSet.add(new Integer("1"));
hSet.add(new Integer("2"));
hSet.add(new Integer("3"));
System.out.println(hSet.contains(new Integer("3")));
是的
但是当我在 Movie 对象上使用它时(我想检查):
Set<Movie> hSet = new HashSet<Movie>();
hSet.add(new Movie(222, "Lord of the Rings", "something"));
System.out.println(hSet);
System.out.println(hSet.contains(new Movie(222, "Lord of the Rings", "something")));
假
hSet 打印显示:
[id: 222name: 指环王]
我看不出在列表中添加新整数或添加新电影对象有什么不同。那么为什么我的示例不起作用?
//编辑。
如果有人正在寻找一个好的参考,this helped me out。
【问题讨论】:
-
Movie是否正确实现了equals()和hashCode()? -
造成这种差异的原因是
Integer会覆盖hashCode和equals,而Movie不会。 -
因为要在 Hashing thingy 中正常工作,你的类 Movie 必须实现 hashCode()。在那里实现equals()也是一件好事。 Integer 确实覆盖了这两个方法,而您的类很可能不会。
-
哦,是的,我忘记了。谢谢,我去看看。