【问题标题】:What is increased cost of TreeSet vs LinkedHashSet and TreeMap over LinkedHashMap?TreeSet 与 LinkedHashSet 和 TreeMap 相比 LinkedHashMap 的成本增加了多少?
【发布时间】:2019-05-05 14:19:43
【问题描述】:

LinkedHashSet - 此实现将其客户端从 HashSet 提供的未指定、通常混乱的排序中解救出来,而不会导致 与 TreeSet 相关的成本增加

LinkedHashMap 与 TreeMap 也是如此

这个增加的成本到底是多少(LinkedHashMap vs TreeMap)?

这是否意味着 TreeSet 每个元素需要更多内存? LinkedHashSet 需要更多的内存用于两个额外的链接,但是 TreeSet 需要额外的内存来存储 Map.Entry 元素对(因为隐式基于 TreeMap),此外 LinkedHashSet 是基于 HashMap 的,它也有 Map.Entry 元素对开销...

所以区别在于添加新元素的速度(在 TreeSet 的情况下,由于某些“排序”而需要更长的时间)。

还有哪些其他显着增加的成本?

【问题讨论】:

  • 一个 TreeSet 插入或查找是 O(log(n))。如果 O(1),则进行 LinkedHashSet 插入或查找。这是主要区别。

标签: java collections


【解决方案1】:

TreeSet/TreeMap对于add()contains()(对于TreeSet)、put()containsKey()(对于TreeMap)等操作有更高的时间复杂度。 . 因为它们需要对数时间来定位树中的元素(或向树中添加元素),而 LinkedHashSet/LinkedHashMap 需要预期的恒定时间来进行这些操作。

在内存需求方面,差别很小:

  • TreeMap 条目包含键、值、3 个Entry 引用(左、右、父)和一个boolean

  • LinkedHashMap 条目包含键、值、3 个Entry 引用(下一个、之前、之后)和一个int

【讨论】:

    【解决方案2】:

    在迭代HashSet时,迭代顺序一般是对象的hash顺序,如果想要一个可预测的顺序,一般不会太有用。

    如果合理的排序很重要,您通常需要使用TreeSet,它按排序顺序进行迭代,但要付出一定的代价,因为保持排序顺序会增加流程的复杂性。

    LinkedHashSet 可以用作HashSet 看似疯狂的排序的中间解决方案,方法是使用插入顺序确保迭代顺序至少是一致的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-09
      • 2014-12-04
      • 1970-01-01
      • 1970-01-01
      • 2012-05-13
      • 1970-01-01
      • 1970-01-01
      • 2011-03-25
      相关资源
      最近更新 更多