控制元素插入红黑树的 Java TreeSet 方法

标签 java collections treeset red-black-tree

我真的很想加深对 TreeSet(尤其是不使用比较器的无参数版本)如何按顺序维护其包含的元素的理解。我到处都找不到令人满意的解释;它们对我来说要么太基础要么太高级。根据我的研究,似乎 TreeSets 实际上将它们的元素存储在 TreeMap 中,而 TreeMaps 实际上是红黑树。我对自己对如何将元素添加到红黑树的理解充满信心。

我假设在 Java API 的某处必须有一个算法或方法来执行将元素插入到红黑树中。我的第一个问题是该算法位于 Java API 中的什么位置?

此外,这个算法究竟是如何调用的?我猜它是由 TreeSet 类中的 add(E e) 方法调用的,对吧?有人可以提供有关将元素添加到树集中时发生的确切事件链的更多详细信息。

最后,作为一个实验,我给了一个对象一个 compareTo() 方法,但没有实现 Comparable 接口(interface)。尝试将这些对象添加到 TreeSet 时,会引发异常。我想了解为什么即使对象具有 compareTo() 方法也会抛出异常。我猜想在插入算法的某个地方有一个方法要求所有对象都实现 Comparable,这是正确的吗?抛出异常的 stackTrace 指向 TreeMap.compare() 方法。我想这是需要添加到 TreeSet 的所有对象都实现 Comparable 接口(interface)的方法,但我在 API 中看不到这个 TreeMap.compare() 方法。如何在 API 中找到有关此 TreeMap.compare() 方法的更多信息?

非常感谢您的帮助。

最佳答案

  1. TreeSet 的无参数版本/TreeMap确实使用了 Comparator ,特别是自然顺序比较器(Java 8 中的 Comparator.naturalOrder() )。这意味着 key 类型必须是 Comparable<?> 。 ,因为这清楚地表明类的实例可以相互比较。

  2. Java 是一种强类型语言,这意味着变量的类型优先于它包含的方法。如果有人决定重命名 compareTo 几年后你类的方法没有意识到它在Comparable中使用上下文(如果这是一个大型系统,这是完全合理的),这将导致痛苦和痛苦。 implements Comparable<?>声明从一开始就明确了这一意图。

关于控制元素插入红黑树的 Java TreeSet 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39799696/

相关文章:

java - 如何避免堆栈堆积?

java - 使不同的 TreeSet 保持与另一个 TreeSet 相同的顺序

java - 对于非常大的数据集,我应该使用 `HashSet` 还是 `TreeSet`?

java - 如何为 Jackson 编写自定义 JSON 反序列化器?

java - JSP 在我的 WEB-INF/lib 和构建路径中找不到 JDBC 驱动程序

java - 如何使用 jsonschema2pojo 生成包含名为 "System"的类的类?

java - 与预泛型原始类型的泛型边界

Java Collection Framework Set 与数学 Set 相比?

java - 我想扩展ArrayList来实现但无法访问element Data private var

java - 将 HashMap 值添加到 TreeSet 时出错