我一直在研究 HashSet
与 TreeSet
的复杂性,并且到处都发现主题解释:“HashSet
更快,因为它O(1) 而不是 O(log n)。”我当然知道这一点。
但是,这只适用于非常大的集合。另一方面,我需要处理数百万个“小”集,每个集最多包含 200 个对象,而且大多数要少得多(低于 20 个)。对它们的操作非常多样化(创建、添加、删除、成员测试、克隆……),因此我对如何最好地测量/模拟差异感到困惑。
对于如此小的集合大小,这两个类中哪一个的开销最小?无论是在速度还是在内存开销方面。那么LinkedHashSet
呢?
最佳答案
and hence I'm puzzled on how to best measure/simulate the difference.
使用分析器。如果 Set 操作不主导结果(CPU 时间、内存占用、分配率),那么您的选择在实践中不会产生影响,因为 amdahl's law. .
TreeSet 最大的优点是排序。
这两种实现都不是特别节省内存,有更好的集合,具体取决于您最关心的性能指标。它们是相应 Map 实现的包装器,并且 Map 本身也不是特别高效。
它们的设计更加注重灵活性,提供大量的 API,而不是优化任何特定的性能方面。
关于java - 当 O(1) 与 O(log n) 无关紧要时,TreeSet 与 HashSet 对于小集合大小的速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31578766/