我正在运行一些基准测试。我的一项测试取决于顺序,因此我为此使用了 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内部使用TreeMapswhich are Red Black Trees(special type of BST) 。
BST中序遍历是O(n)
HashSets内部使用HashMapswhicharray用于保存 Entry 对象。
这里也应该遍历O(n)。
除非您编写基准测试,否则很难证明哪个更快。
如果您想要(几乎)具有 a 性能的稳定排序HashSet,请使用 a LinkedHashSet。你仍然会得到恒定时间的操作,而我会假设 aTreeSet会让你得到对数时间。