编辑:现在只考虑 ArrayDeque。(我原本以为LinkedList
也不会覆盖这两种方法。)
集合类型ArrayDeque
仅使用它从 Object 继承的hashCode
和equals
方法实现。
为什么不使用适当的实现来覆盖这些方法(即基于包含元素的哈希和相等性测试)?
编辑:现在只考虑 ArrayDeque。(我原本以为LinkedList
也不会覆盖这两种方法。)
集合类型ArrayDeque
仅使用它从 Object 继承的hashCode
和equals
方法实现。
为什么不使用适当的实现来覆盖这些方法(即基于包含元素的哈希和相等性测试)?
LinkedList
extends AbstractSequentialList
which extends AbstractList
which does override equals
and hashCode
- 所以实现不是从Object
.
ArrayDeque
,另一方面,据我所知,实际上并没有继承任何其他实现。它的直接超类 ( AbstractCollection
) 不会覆盖它们。这感觉像是一个例外而不是规则——我相信Java 中的大多数集合实现“做正确的事”。
我不知道ArrayDeque
选择不实现相等的理由,但如果你想比较两个双端队列,你可以轻松地将它们转换为列表或数组并这样做。
它们在 中被覆盖AbstractList
,即存在于LinkedList
继承中
对于将要发生突变以报告自己与自身以外的任何事物相同的对象实例,这通常是没有意义的。某些可变集合类型的实例报告自己与其他集合实例相同的主要原因是代码通常会保存对实例的引用,即使它们“可能”被变异,也不会。尽管代码可以保存对两个ArrayDequeue
的引用,以封装曾经或将要ArrayDequeue
放入其中的所有项目,并且比较为此目的而保存的两个实例的内容可能是有意义的,但该类型的全部目的是促进项目的推送和弹出;在有意义的情况下equals
要检查相同的内容,将内容提取到旨在封装列表的类型中也可能有意义。
根据官方Javadoc - 你不正确。LinkedList 使用 AbstractList 中的 equals,执行深度相等
有关更多信息 - 看看这个 - http://docs.oracle.com/javase/6/docs/api/java/util/AbstractList.html#equals(java.lang.Object)
使用 Guava,您可以使用该Iterables.elementsEqual
方法。