为什么LinkedHashSet没有addFirst方法?

时间:2018-12-21 00:53:18

标签: java linked-list deque linkedhashset

根据LinkedHashSet的文档,它是

  

Set接口的哈希表和链表实现,带有   可预测的迭代顺序。此实现不同于HashSet   因为它维护了遍历其所有内容的双向链表   条目。

因此,它实际上是一个HashSet,具有由链表实现的键的FIFO队列。考虑到LinkedListDeque并特别允许在开始插入,我想知道为什么LinkedHashSet除了在本文档中介绍的方法之外还没有addFirst(E e)方法Set界面。似乎不难实现。

1 个答案:

答案 0 :(得分:1)

正如埃利奥特·弗里希(Eliott Frisch)所说,答案在您引用的段落的下句话中:

  

…此链接列表定义了迭代顺序,即顺序   其中元素插入到集合中( insertion-order )。 …

addFirst方法会破坏插入顺序,从而破坏LinkedHashSet的设计思路。

如果我也可以添加一些猜测,其他可能的原因可能包括:

  • 实现起来并不像看起来那样简单,因为LinkedHashSet实际上是作为LinkedHasMap实现的,其中未使用映射到的值。至少您也必须更改该类(这反过来也会破坏的插入顺序,从而破坏其设计思路)。
  • 正如其他人可能打算在评论中说的那样,他们认为它没有用。

也就是说,您是在问错误的方法。他们设计了具有所需功能的类。他们继续使用哈希表和链接列表来实现它。您将从实施开始,并将其用作设计讨论的基础。尽管有时可能会添加一些有用的东西,但是通常这并不是实现良好设计的方法。

虽然我在理论上可以理解您的观点,即在某些情况下您可能希望使用具有set属性的双端队列(重复项将被忽略/消除),但我很难想象Deque何时会在这种情况下不能满足您的需求(Eliott Frisch提到了未充分使用的ArrayDeque)。在containsremove的线性复杂度被禁止之前,您需要大量的数据和/或非常严格的性能要求。在这种情况下,您可以更好地定制设计自己的数据结构。