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 变量相互比较。
当然,您可以避免在 CustomClass
的 equals()
和 hashCode()
实现中使用 actionList
字段,如果您确定它的值是对您的 CustomClass
不重要。但无论如何,在您的 classes.
中提供这两种方法的实现是一种“好风格”
我有以下情况:
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 变量相互比较。
当然,您可以避免在 CustomClass
的 equals()
和 hashCode()
实现中使用 actionList
字段,如果您确定它的值是对您的 CustomClass
不重要。但无论如何,在您的 classes.