编辑:现在只考虑ArrayDeque。(起初我认为LinkedList也没有覆盖这两个方法。)
集合类型ArrayDeque直接使用从Object继承的hashCode和equals方法实现。
为什么它不用包含元素进行哈希和相等性测试来代替,从而覆盖这些方法并进行适当的实现呢?
编辑:现在只考虑ArrayDeque。(起初我认为LinkedList也没有覆盖这两个方法。)
集合类型ArrayDeque直接使用从Object继承的hashCode和equals方法实现。
为什么它不用包含元素进行哈希和相等性测试来代替,从而覆盖这些方法并进行适当的实现呢?
LinkedList
是一个扩展自AbstractSequentialList
的类,而后者继承自AbstractList
,这个类确实重写了equals
和hashCode
方法——因此这些实现并非从Object
类中继承而来。ArrayDeque
似乎没有继承除实现以外的任何东西。它的直接超类(AbstractCollection
)没有重写它们。这感觉像是个例外情况,而不是规则——我相信Java中的大多数集合实现会"做正确的事情"。ArrayDeque
选择不实现相等性的理由,但如果您想比较两个双端队列,可以轻松地将它们转换为列表或数组,然后进行比较。它们被覆盖在AbstractList
中,这个类存在于LinkedList
继承链中。
assertEquals
失败时,这只会让事情稍微有些混乱 :) - Kilokahn根据官方Javadoc - 你是不正确的。LinkedList使用来自AbstractList的equals,执行深equals
欲了解更多信息,请查看此处 - http://docs.oracle.com/javase/6/docs/api/java/util/AbstractList.html#equals(java.lang.Object)
使用Guava,您可以使用Iterables.elementsEqual
方法。
Collection.equals
文档包括“Collection接口对于Object.equals的一般约定没有任何规定”和“没有必要这样做(即覆盖equals
),而最简单的方法是依赖于Object的实现”。 - Jon Skeet