我真的想加深我对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()方法的更多信息?
事先非常感谢您的帮助
Java是一种强类型语言,这意味着变量的类型优先于它所包含的方法。如果有人决定在您的班级中重命名
compareTo
方法,而没有意识到它在Comparable
上下文中使用(如果这是一个大型系统,这是完全合理的),这将导致痛苦和痛苦。implements Comparable<?>
宣言从一开始就明确了这一意图。
TreeSet
/TreeMap
的无参数版本确实使用了Comparator
,特别是自然顺序比较器(Java 8中的Comparator.naturalOrder()
)。这意味着键类型必须是Comparable<?>
,因为这清楚地表明类的实例可以相互比较。
请参阅TreeMap
源代码。具体来说,跳到2039
行。这是对应于Java版本8更新40的源代码。
在那里你可以思考所有的红黑机制。基本上,它或多或少像您建议的那样:编写方法触发树的节点的再平衡。
对于compareTo
方法,TreeSet
/TreeMap
的元素必须实现Comparable
接口。实现compareTo
方法还不够,元素必须是Comparable
的显式子类型。