在类TreeMap
中,Java API说:
基于红黑树的NavigableMap实现。地图根据其键的自然顺序进行排序,或者根据使用的构造函数在地图创建时提供的比较器进行排序。
自然排序是什么意思?用作键的类不必实现Comparable
接口,而是使用什么顺序?
答案 0 :(得分:6)
如果你自己尝试这样做,你会发现你不能使用TreeMap
K
未实现Comparable
的{{1}}(除非你明确提供{{1}通过Comparator
构造函数)。
TreeMap
线程“main”中的异常java.lang.ClassCastException:App无法强制转换为java.lang.Comparable
public class App
{
public static void main( String[] args )
{
TreeMap<App,String> tm = new TreeMap<App,String>();
tm.put(new App(), "value");
}
}
的javadoc明确说明了这一点:
抛出:
ClassCastException - 如果指定的键无法与地图中当前的键进行比较
javadocs for TreeMap中的“自然订购”链接将您带到put()
界面
答案 1 :(得分:5)
“自然”排序是由TreeMap
中用作键的对象实现Comparable
接口所暗示的排序。从本质上讲,RBTree必须能够告诉哪个键小于另一个键,并且有两种方法可以将该逻辑提供给RBTree实现:
TreeMap
的键或Comparable
接口
Comparator
的实现,它将在密钥类本身之外进行比较。答案 2 :(得分:3)
是实施Comparable
的要求。它只是在编译时没有强制执行。
jamlong% cat Wah.java
import java.util.*;
public class Wah {
public static void main(String[] args) {
TreeMap<Wah, Integer> wah = new TreeMap<Wah, Integer>();
wah.put(new Wah(), 1);
wah.put(new Wah(), 2);
}
}
jamlong% java Wah
Exception in thread "main" java.lang.ClassCastException: Wah cannot be cast to java.lang.Comparable
at java.util.TreeMap.put(TreeMap.java:542)
at Wah.main(Wah.java:8)
如有疑问,read the TreeMap
source。例如,第541行。
答案 3 :(得分:2)
自然排序只是Comparable
接口提供的顺序。您可以在没有TreeMap
的情况下创建Comparator
,但是任何尝试放置任何未实现自然顺序的键都会抛出ClassCastException
。
答案 4 :(得分:0)
自然顺序由键决定。
因此,如果您使用String,您将获得一个订购;整数将给另一个。
我认为可比较是必需的。