包含列表的自定义对象的Java HashSet和HashCode
我有以下情况:包含列表的自定义对象的Java HashSet和HashCode,java,linked-list,equals,hashcode,hashset,Java,Linked List,Equals,Hashcode,Hashset,我有以下情况: public class CustomClass { private LinkedList<ActionClass> actionList; private MyReaderClass reader; //methods... //other methods... hashcode() equals() //blabla } 公共类CustomClass{ 私有链接列
public class CustomClass {
private LinkedList<ActionClass> actionList;
private MyReaderClass reader; //methods...
//other methods...
hashcode()
equals()
//blabla
}
公共类CustomClass{
私有链接列表操作列表;
私有MyReaderClass reader;//方法。。。
//其他方法。。。
hashcode()
等于()
//布拉布拉
}
现在,我在hashset中使用customclass,但我不知道是否需要在ActionClass中实现hashcode和equals方法,因为它包含在我使用的链接列表中。
感谢您的回复是的,如果您想使用
CustomClass
作为HashSet集合的元素,您必须提供hashCode
方法。要为对象获得真正唯一的哈希代码,必须计算它,包括所有对象文件的哈希代码。在您的情况下,包括actionList
的哈希代码
由于JavaDoc的原因:
返回此列表的哈希代码值。列表的哈希代码定义为以下计算的结果:
int hashCode = 1;
for (E e : list)
hashCode = 31*hashCode + (e==null ? 0 : e.hashCode());
这意味着您也必须为ActionClass
提供哈希(hashCode()
实现),以便计算集合的哈希代码
如果要将类添加到其他一些不需要对象哈希的集合中,则对的情况也是如此:
比较指定对象与此列表是否相等。当且仅当指定对象也是列表、两个列表的大小相同且两个列表中所有对应的元素对相等时,返回true
您必须在ActionClass
中提供equals()
方法的实现,以使LinkedList
类型的2个变量相互可比
当然,您可以避免在
equals()
和hashCode()
实现CustomClass
时使用actionList
字段,如果您确定它的值对CustomClass
不重要。但无论如何,在类中为这两种方法提供实现是一种“好风格”。您的问题非常不清楚。请扩展示例代码,更具体地说明如何使用CustomClass
。