Java 包含列表的自定义对象的 HashSet 和 HashCode

Java HashSet and HashCode for custom object that contains a list

我有以下情况:

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

现在,我在哈希集中使用自定义类,但我不明白是否需要在 ActionClass 中实现方法哈希码和等于,因为它包含在我使用的链表中. 感谢回复

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

由于 List#hashCode() 的 JavaDoc:

Returns the hash code value for this list. The hash code of a list is defined to be the result of the following calculation:

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

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

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

Compares the specified object with this list for equality. Returns true if and only if the specified object is also a list, both lists have the same size, and all corresponding pairs of elements in the two lists are equal.

您必须在 ActionClass 中提供 equals() 方法的实现,以使 LinkedList<ActionClass> 类型的 2 变量相互比较。

当然,您可以避免在 CustomClassequals()hashCode() 实现中使用 actionList 字段,如果您确定它的值是对您的 CustomClass 不重要。但无论如何,在您的 classes.

中提供这两种方法的实现是一种“好风格”