java中的hashcode实现

时间:2012-08-22 16:21:21

标签: java hashcode

我在确定如何为以下示例实现工作哈希码时遇到一些麻烦:

我有2个班级:

Class A
{
} 

Class B 
{
  protected List<A> constitutingObjects;
}

已经覆盖等于所以对象A等于对象B,如果A是B.constituteObects的一部分。 我遇到的问题是,我不确定如何为此实现Hashcode。

有什么想法吗?

感谢。

2 个答案:

答案 0 :(得分:1)

TL; DR:你要做的事情没有意义。退后一步,尝试以不同的方式解决你的更大任务。

  

已经覆盖等于,如果A是B.constituteObects的一部分,则A类等于B类

这听起来像非常糟糕的主意。很难说这些对象意味着什么,但是包含集合的东西在逻辑上不等于该集合的元素 - 购物清单不等于“牛奶”。

不要忘记必须遵循java.lang.Object文档指定的要求。很多其他代码依赖来保证这些。

除非你只返回一个常量,否则基本上不可能实现hashCode。两个相等对象的哈希码必须相等,这意味着ClassB的任何实例的哈希码必须等于 {{1}的每个元素的哈希码。 },这意味着所有这些元素都必须具有相同的哈希码。除非constitutingObjects的实例以某种方式“知道”他们的容器是什么,否则我看不出这是怎么可能的。

答案 1 :(得分:0)

在Java中定义equalshashCode时,你没有测试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)可能为真或假