【问题标题】:Why doesn't LinkedHashSet have addFirst method?为什么 LinkedHashSet 没有 addFirst 方法?
【发布时间】:2019-05-21 12:30:36
【问题描述】:

正如LinkedHashSet 的文档所述,它是

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

所以它本质上是一个HashSet,具有由链表实现的 FIFO 键队列。考虑到LinkedListDeque 并且特别是允许在开头插入,我想知道为什么LinkedHashSet 除了Set 接口中存在的方法之外还没有addFirst(E e) 方法。实现这一点似乎并不难。

【问题讨论】:

  • @RoyShahaf 你确定吗? add for LinkedList 等价于 addLastaddFirst 有不同的含义。
  • addFirst 函数什么时候有用?
  • 因为LinkedHashSet 保留了插入顺序。而已。没有办法操纵该顺序。另外,如果你添加了接口中没有的方法,那么你就不能再对通用接口进行编程了。
  • @ElliottFrisch 如果遍历顺序很重要,那么您通常已经在使用更具体的类型。
  • Javadoc 说(部分)这个链表定义了迭代顺序,即元素插入集合的顺序(插入顺序)。你想要ArrayDeque

标签: java linked-list deque linkedhashset


【解决方案1】:

正如 Eliott Frisch 所说,答案在您引用的段落的下一句中:

…这个链表定义了迭代顺序,也就是顺序 其中元素被插入到集合中(insertion-order)。 …

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

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

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

也就是说,您问的问题是错误的。他们设计了一个具有他们认为需要的功能的类。他们继续使用哈希表和链表来实现它。您从实现开始,并将其用作设计讨论的基础。虽然这可能偶尔会增加一些有用的东西,但通常这不是好的设计的方法。

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

【讨论】:

    猜你喜欢
    • 2015-04-03
    • 2019-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-16
    • 2015-05-01
    相关资源
    最近更新 更多