TreeSet的优点和缺点是什么

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

其中一个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实现来定义自然顺序。

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

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

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

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

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

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

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