根据LinkedHashSet
的文档,它是
Set接口的哈希表和链表实现,带有 可预测的迭代顺序。此实现不同于HashSet 因为它维护了遍历其所有内容的双向链表 条目。
因此,它实际上是一个HashSet
,具有由链表实现的键的FIFO队列。考虑到LinkedList
是Deque
并特别允许在开始插入,我想知道为什么LinkedHashSet
除了在本文档中介绍的方法之外还没有addFirst(E e)
方法Set
界面。似乎不难实现。
答案 0 :(得分:1)
正如埃利奥特·弗里希(Eliott Frisch)所说,答案在您引用的段落的下句话中:
…此链接列表定义了迭代顺序,即顺序 其中元素插入到集合中( insertion-order )。 …
addFirst
方法会破坏插入顺序,从而破坏LinkedHashSet
的设计思路。
如果我也可以添加一些猜测,其他可能的原因可能包括:
LinkedHashSet
实际上是作为LinkedHasMap
实现的,其中未使用映射到的值。至少您也必须更改该类(这反过来也会破坏其的插入顺序,从而破坏其设计思路)。也就是说,您是在问错误的方法。他们设计了具有所需功能的类。他们继续使用哈希表和链接列表来实现它。您将从实施开始,并将其用作设计讨论的基础。尽管有时可能会添加一些有用的东西,但是通常这并不是实现良好设计的方法。
虽然我在理论上可以理解您的观点,即在某些情况下您可能希望使用具有set属性的双端队列(重复项将被忽略/消除),但我很难想象Deque
何时会在这种情况下不能满足您的需求(Eliott Frisch提到了未充分使用的ArrayDeque
)。在contains
和remove
的线性复杂度被禁止之前,您需要大量的数据和/或非常严格的性能要求。在这种情况下,您可以更好地定制设计自己的数据结构。