【问题标题】:Java HashSet and HashCode for custom object that contains a list包含列表的自定义对象的 Java HashSet 和 HashCode
【发布时间】:2015-10-20 08:54:25
【问题描述】:

我有以下情况:

    public class CustomClass {
       private LinkedList<ActionClass> actionList;
       private MyReaderClass reader; //methods...
       //other methods...
       hashcode()
       equals()
       //blabla
    }

现在,我在 hashset 中使用 customclass,但我不明白它是否需要在 ActionClass 中实现方法 hashcode 和 equals,因为它包含在我使用的链表中。 感谢回复

【问题讨论】:

  • 你的问题很不清楚。请您扩展您的示例代码以更具体地显示您如何使用CustomClass

标签: java linked-list equals hashcode hashset


【解决方案1】:

是的,如果你想使用你的CustomClass 作为 HashSet 集合的元素,你必须提供hashCode 方法。并且要为您的对象获得真正唯一的哈希码,您必须计算它,包括所有对象文件的哈希码。在您的情况下,包括actionList 的哈希码。

由于List#hashCode() 的JavaDoc:

返回此列表的哈希码值。列表的哈希码定义为以下计算的结果:

int hashCode = 1;
for (E e : list)
 hashCode = 31*hashCode + (e==null ? 0 : e.hashCode());

这意味着,您还必须为您的 ActionClass 提供哈希(hashCode() 实现),以便计算集合的哈希码。

List#equals() 也是如此,如果你想将你的类添加到其他一些不需要对象哈希的集合中:

比较指定对象与此列表是否相等。当且仅当指定对象也是一个列表时返回 true,两个列表具有相同的大小,并且两个列表中所有对应的元素对都相等。

您必须在您的ActionClass 中提供equals() 方法的实现,以使LinkedList&lt;ActionClass&gt; 类型的2 个变量相互可比。

当然,您可以避免在您的equals()hashCode() 实现CustomClass 中使用actionList 字段,如果您确定它的值对于您的CustomClass 并不重要。但无论如何,在你的类中提供这两种方法的实现是一种“好风格”。

【讨论】:

    猜你喜欢
    • 2011-07-03
    • 2015-01-30
    • 1970-01-01
    • 1970-01-01
    • 2019-01-04
    • 2015-09-18
    • 2016-05-28
    • 2023-02-14
    • 1970-01-01
    相关资源
    最近更新 更多