与LinkedHashMap相比,TreeSet与LinkedHashSet和TreeMap的增加成本是多少?

时间:2018-12-04 07:56:27

标签: java collections

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

LinkedHashMap与TreeMap的说法相同

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

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

所以区别在于添加新元素的速度(如果使用TreeSet,则由于某些“排序”而花费的时间更长)。

还有哪些其他显着增加的费用?

2 个答案:

答案 0 :(得分:5)

TreeSet / TreeMap对于诸如add()contains()(对于TreeSetput(),{ {1}}(用于containsKey()),等等……因为它们需要对数时间才能在树中定位元素(或向树中添加元素),而TreeMap / LinkedHashSet则需要这些操作的预期持续时间。

在内存需求方面,有很小的区别:

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

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

答案 1 :(得分:2)

迭代HashSet时,迭代顺序通常是对象哈希的顺序,如果您想要可预测的顺序,则通常不太有用。

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

通过确保插入顺序至少与迭代顺序保持一致,LinkedHashSet可以用作HashSet看上去疯狂的排序的中间依据。