TreeSet的优点和缺点是什么?

时间:2009-08-19 06:40:26

标签: java data-structures treeset

只是想知道TreeSet的优点和缺点是什么,如果有人能告诉我的话?谢谢!

5 个答案:

答案 0 :(得分:24)

其中一个Collection类。它允许您通过键或按键顺序访问集合中的元素。它比ArrayList或HashMap有更多的开销。当您不需要顺序访问时使用HashSet,只需按键查找。使用ArrayList并使用Arrays。如果您只想按顺序排列元素,请排序。 TreeSet始终按顺序保存元素。使用ArrayList,您只需在需要时进行排序。 使用TreeSet时,密钥必须嵌入到您在集合中存储的对象中。通常你可能有TreeSet of Strings。那么你所能做的就是告诉给定的String是否在Set中。它不会像Treemap那样找到你关联的对象。使用TreeMap,键和它们关联的对象是分开的。

TreeSet和它的兄弟TreeMap奇怪地与表示树无关。在内部,他们使用树组织为您提供按字母顺序排序的Set / Map,但您无法控制父母和孩子之间的链接。

内部TreeSet使用红黑树。无需预先分配数据即可获得均衡的树。另一方面,如果数据被排序(升序或降序),它将不会像其他类型的树一样受到伤害。

如果您没有提供Comparator来定义所需的顺序,TreeSet需要在item类上使用Comparable实现来定义自然顺序。

答案 1 :(得分:9)

缺点:TreeSet的一个缺陷是它以意想不到的方式实现了Set接口。 如果TreeSet包含对象a,那么如果a.compareTo(b)返回0,则对象b被视为集合的一部分,即使a.equals(b)为false,因此如果compareTo和equals没有以一致的方式实现,你是一个糟糕的旅程。

当方法返回Set时,这尤其是一个问题,并且您不知道该实现是TreeSet还是HashSet。

这里要学习的教训是,始终避免实施compareTo并且等于不一致。如果需要以与equals不一致的方式对对象进行排序,请使用Comparator。

答案 2 :(得分:3)

TreeSet中:
优点:基于红/黑树算法排序,为操作提供O(log(N))复杂度 缺点:值必须是 Comparable ,或者您需要在构造函数中提供 Comparator 。此外,HashSet实现提供了更好的性能,因为它提供了~O(1)复杂度。

答案 3 :(得分:2)

TreeSet会分段内存,并且会产生额外的内存开销。您可以查看源并计算额外内存量以及它创建的其他对象数量。当然这取决于存储对象的性质,你也可以怀疑我对内存的偏执:)但最好不要在这里和那里花费 - 你有GC,你有缓存未命中,所有这些都是懒散的。

通常您可以使用PriorityQueue而不是TreeSet。在典型的用例中,最好只对字符串数组进行排序。

答案 4 :(得分:-1)

我想这个数据结构将使用二叉树来维护数据,以便可以进行升序检索。在这种情况下,如果它试图保持树的平衡,那么删除操作将有点贵。