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

时间:2015-10-20 08:54:26

标签: java linked-list equals hashcode hashset

我有以下情况:

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

现在,我在hashset中使用了customclass,但是我不知道它是否需要在ActionClass中实现方法hashcode和equals,因为它包含在链接中我用过的清单。 感谢您的回复

1 个答案:

答案 0 :(得分:0)

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

由于List#hashCode()的JavaDoc:

  

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

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

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

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

  

将指定对象与此列表进行比较以获得相等性。当且仅当指定的对象也是列表时,返回true,两个列表具有相同的大小,并且两个列表中的所有对应的元素对相等。

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

当然,如果您确定的话,可以避免在actionListequals() hashCode()实施CustomClass字段中使用CustomClass字段。价值对您的#test.R x <- y <- seq(10,70,10) png("test.png") plot(x, y, type='o', col='red') grid() title(main="title", font.main=5) title(xlab="B", col.lab="black") title(ylab="C", col.lab="black") 并不重要。但无论如何,它是一个很好的风格&#34;在类中提供这两种方法的实现。