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



我真的想加深我对TreeSet,特别是不使用比较器的无参数版本,如何按顺序维护它所包含的元素的理解。我在任何地方都找不到令人满意的解释;对我来说,它们要么太基础,要么太高级。从我的研究来看,TreeSets实际上将它们的元素存储在TreeMap中,而TreeMaps实际上是红黑树。对于如何将元素添加到红黑树中,我对自己的理解很有信心。

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

还有,这个算法究竟是如何被调用的?我猜它是由TreeSet类中的add(E)方法调用的,对吧?有谁能提供更多关于向树集添加元素时发生的事件链的详细信息吗?

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

事先非常感谢您的帮助

  1. TreeSet/TreeMap的无参数版本确实使用了Comparator,特别是自然顺序比较器(Java 8中的Comparator.naturalOrder())。这意味着键类型必须是Comparable<?>,因为这清楚地表明类的实例可以相互比较。
  2. Java是一种强类型语言,这意味着变量的类型优先于它所包含的方法。如果有人决定在您的班级中重命名compareTo方法,而没有意识到它在Comparable上下文中使用(如果这是一个大型系统,这是完全合理的),这将导致痛苦和痛苦。implements Comparable<?>宣言从一开始就明确了这一意图。

请参阅TreeMap源代码。具体来说,跳到2039行。这是对应于Java版本8更新40的源代码。

在那里你可以思考所有的红黑机制。基本上,它或多或少像您建议的那样:编写方法触发树的节点的再平衡。

对于compareTo方法,TreeSet/TreeMap的元素必须实现Comparable接口。实现compareTo方法还不够,元素必须是Comparable的显式子类型。

最新更新