为什么ArrayDeque不重写equals()和hashCode()?

时间:2013-08-13 08:10:06

标签: java collections equals hashcode

已编辑:现在只考虑ArrayDeque。 (我原本认为LinkedList也不会覆盖这两种方法。)

集合类型ArrayDeque只使用从Object继承的hashCodeequals方法实现。

为什么不用正确的实现覆盖这些方法(即基于包含的元素的哈希和相等测试)?

4 个答案:

答案 0 :(得分:8)

LinkedList扩展AbstractSequentialList扩展AbstractList 覆盖equalshashCode - 所以实现继承自Object

另一方面,

ArrayDeque,就我所见, 实际上并没有继承任何其他实现。它的直接超类(AbstractCollection)不会覆盖它们。这感觉就像一个例外,而不是规则 - 我相信Java中的大多数集合实现“做正确的事情”。

我不知道ArrayDeque选择不实现相等的理由,但是如果你想比较两个deques,你可以很容易地将它们转换成列表或数组,并按照这种方式进行。

答案 1 :(得分:1)

它们在AbstractList中被覆盖,LinkedList继承中存在

答案 2 :(得分:1)

对象实例通常没有意义,它们将被变异以将自己报告为与其他任何东西相等。一些可变集合类型的实例报告自身与其他集合实例相同的主要原因是代码保持对实例的引用是常见的,即使它们“可能”被突变,也不会。虽然代码可以保存对两个ArrayDequeue的引用,目的是封装所有已经存在或将要放入的项目,并且比较它可能是有意义的。为此目的而举行的两个ArrayDequeue实例的内容,该类型的整个目的是促进项目的推送和弹出;如果equals检查相同的内容是有意义的,那么将内容提取到一个用于封装列表的类型中也是有意义的。

答案 3 :(得分:0)

据官方Javadoc说 - 你不对。 LinkedList使用来自AbstractList的equals,执行deep equals

有关详细信息,请查看此内容 - http://docs.oracle.com/javase/6/docs/api/java/util/AbstractList.html#equals(java.lang.Object)