【发布时间】:2017-02-09 12:20:57
【问题描述】:
我真的很想加深我对 TreeSet(尤其是不使用比较器的无参数版本)如何按顺序维护其包含的元素的确切理解。我在任何地方都找不到令人满意的解释;它们对我来说要么太基础,要么太先进。根据我的研究,TreeSets 似乎实际上将它们的元素存储在 TreeMap 中,而 TreeMaps 实际上是红黑树。我对自己对如何将元素添加到红黑树的理解充满信心。
我假设在 java API 中的某处必须有一种算法或方法可以将元素插入红黑树。我的第一个问题是该算法在 Java API 中的什么位置?
另外,这个算法究竟是如何调用的?我猜它是由 TreeSet 类中的 add(E e) 方法调用的,对吧?有人可以提供有关将元素添加到树集中时发生的确切事件链的更多详细信息。
最后,作为一个实验,我给一个对象一个 compareTo() 方法,但没有实现 Comparable 接口。尝试将这些对象添加到 TreeSet 时,会引发异常。我想了解为什么即使对象具有 compareTo() 方法也会引发异常。我猜在插入算法的某个地方有一个方法要求所有对象都实现 Comparable,这是正确的吗?抛出异常的 stackTrace 指向 TreeMap.compare() 方法。我想这是要求添加到 TreeSet 的所有对象都实现 Comparable 接口的方法,但我在 API 中看不到这个 TreeMap.compare() 方法。如何在 API 中找到有关此 TreeMap.compare() 方法的更多信息?
非常感谢您的帮助。
【问题讨论】:
-
"为什么即使对象有 compareTo() 方法也会抛出异常。" Java 不使用duck typing。仅仅存在一个名为
compareTo()的方法是不够的:该类必须实现Comparable并正确覆盖compareTo()才能使用。 -
TreeMap.compare是一个私有实现细节,不作为 API 的一部分公开。
标签: java collections treeset red-black-tree