[英]Is iterating through a TreeSet slower than iterating through a HashSet in Java?
我正在运行一些基准测试。 我的一个测试取决于顺序,所以我正在使用TreeSet。 我的第二个测试没有,所以我正在使用HashSet。
我知道TreeSet的插入速度较慢。 但是如何迭代所有元素呢?
从类似的帖子( Hashset vs Treeset ):
HashSet比TreeSet快得多(对于大多数操作,例如add,remove和contains,常量时间与日志时间相比),但不提供像TreeSet这样的排序保证。
first()
, last()
, headSet()
和tailSet()
等 HashSet
和TreeSet
之间。 实现为具有贯穿其的链表的哈希表,但是它提供了插入顺序的迭代,这与TreeSet保证的排序遍历不同 。 因此,使用的选择完全取决于您的需求,但我觉得即使您需要有序集合,您仍然应该更喜欢HashSet来创建Set,然后将其转换为TreeSet。
Set<String> s = new TreeSet<String>(hashSet);
TreeSets
内部使用TreeMaps
,它是Red Black Trees
(特殊类型的BST
)。
BST
Inorder Traversal是O(n)
HashSets
内部使用HashMaps
,它使用array
来保存Entry对象。
这里的遍历也应该是O(n)
。
除非你写一个基准测试,否则很难证明哪个更快。
如果你想要(几乎) HashSet
的性能稳定排序,那么使用LinkedHashSet
。 你仍然会得到恒定时间的操作,而我认为TreeSet
会让你获得对数时间。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.