LinkedHashSet-此实现将其客户端从HashSet提供的未指定的,通常混乱的顺序中解放出来,而不会导致与TreeSet相关联的成本增加。
LinkedHashMap与TreeMap的说法相同
这增加的成本到底是多少(LinkedHashMap与TreeMap)?
这是否意味着TreeSet每个元素需要更多内存? LinkedHashSet需要更多的内存用于另外两个链接,但是TreeSet需要额外的内存来存储Map.Entry对元素(因为隐式基于TreeMap),此外LinkedHashSet基于HashMap,后者也具有Map.Entry对元素…… / p>
所以区别在于添加新元素的速度(如果使用TreeSet,则由于某些“排序”而花费的时间更长)。
还有哪些其他显着增加的费用?
答案 0 :(得分:5)
TreeSet
/ TreeMap
对于诸如add()
,contains()
(对于TreeSet
,put()
,{ {1}}(用于containsKey()
),等等……因为它们需要对数时间才能在树中定位元素(或向树中添加元素),而TreeMap
/ LinkedHashSet
则需要这些操作的预期持续时间。
在内存需求方面,有很小的区别:
LinkedHashMap
条目包含键,值,3个TreeMap
引用(左,右,父级)和一个Entry
。
boolean
条目包含键,值,3个LinkedHashMap
引用(下一个,之前,之后)和一个Entry
。
答案 1 :(得分:2)
迭代HashSet时,迭代顺序通常是对象哈希的顺序,如果您想要可预测的顺序,则通常不太有用。
如果合理的排序很重要,则通常需要使用TreeSet,它可以按排序顺序进行迭代,但是要付出一定的代价,因为维护排序顺序会增加流程的复杂性。
通过确保插入顺序至少与迭代顺序保持一致,LinkedHashSet可以用作HashSet
看上去疯狂的排序的中间依据。