我在确定如何为以下示例实现工作哈希码时遇到一些麻烦:
我有2个班级:
Class A
{
}
Class B
{
protected List<A> constitutingObjects;
}
已经覆盖等于所以对象A等于对象B,如果A是B.constituteObects的一部分。 我遇到的问题是,我不确定如何为此实现Hashcode。
有什么想法吗?
感谢。
答案 0 :(得分:1)
TL; DR:你要做的事情没有意义。退后一步,尝试以不同的方式解决你的更大任务。
已经覆盖等于,如果A是B.constituteObects的一部分,则A类等于B类
这听起来像非常糟糕的主意。很难说这些对象意味着什么,但是包含集合的东西在逻辑上不等于该集合的元素 - 购物清单不等于“牛奶”。
不要忘记必须遵循java.lang.Object
文档指定的要求。很多其他代码依赖来保证这些。
除非你只返回一个常量,否则基本上不可能实现hashCode
。两个相等对象的哈希码必须相等,这意味着ClassB
的任何实例的哈希码必须等于 {{1}的每个元素的哈希码。 },这意味着所有这些元素都必须具有相同的哈希码。除非constitutingObjects
的实例以某种方式“知道”他们的容器是什么,否则我看不出这是怎么可能的。
答案 1 :(得分:0)
在Java中定义equals
和hashCode
时,你没有测试2个类是否相等,你实际上是在测试2个相同类型(类)的对象是否相等,根据equals
方法或它们可以在同一个&#34;桶&#34; (根据hashCode
确定对象组。
因此,如果x和y是A类型的2个对象:
A x = new A();
A y = new A();
x.equals(b)
为真,那么x.hashCode()
必须等于y.hashCode()
x.hashCode() == y.hashCode()
,则x.equals(y)
可能为真或假