我正在运行一些基准测试。我的一项测试取决于顺序,因此我为此使用了 TreeSet。我的第二个测试没有,所以我使用了 HashSet。
我知道 TreeSet 的插入速度较慢。但是遍历所有元素呢?
来自类似的帖子(Hashset vs Treeset):
HashSet 比 TreeSet 快得多(对于大多数操作,如添加、删除和包含,它是常数时间与日志时间),但不提供像 TreeSet 这样的排序保证。
first()
, last()
,headSet()
等tailSet()
HashSet
和之间TreeSet
。实现为带有链表的哈希表,但它提供了与 TreeSet 保证的排序遍历不同的插入顺序迭代。所以使用的选择完全取决于你的需要,但我觉得即使你需要一个有序的集合,那么你仍然应该更喜欢 HashSet 来创建 Set 然后将其转换为 TreeSet。
Set<String> s = new TreeSet<String>(hashSet);
TreeSets
内部使用TreeMaps
which are Red Black Trees
(special type of BST
) 。
BST
中序遍历是O(n)
HashSets
内部使用HashMaps
whicharray
用于保存 Entry 对象。
这里也应该遍历O(n)
。
除非您编写基准测试,否则很难证明哪个更快。
如果您想要(几乎)具有 a 性能的稳定排序HashSet
,请使用 a LinkedHashSet
。你仍然会得到恒定时间的操作,而我会假设 aTreeSet
会让你得到对数时间。