TreeMap 是按照 Key 的排序结果来组织内部结构的 Map 类集合,它改变了 Map 类散乱无序的形象。虽然它没有 ConcurrentHashMap 和 HashMap 普及(毕竟插入和删除的效率远没有这两者高),但是在 Key 有排序要求的场景下,使用 TreeMap 可以事半功倍。
在 TreeMap 的接口继承树中,有两个与众不同的接口 SortedMap 和 NavigableMap。
SortedMap 接口表示它的 Key 是有序不可重复的,支持直接获取头尾 Key-Value 元素,或者根据 Key 指定范围获取子集合等。插入的 Key 必须实现 Comparable 或提供额外的比较器 Comparator,所以 Key 不允许为 null。NavigableMap 接口继承了 SortedMap 接口,根据指定的搜索条件返回最匹配的 Key-Value 元素。
不同于 HashMap,TreeMap 并非一定要通过覆写 hashCode 和 equals 方法来达到 Key 去重的目的。而是依靠 Comparable 或 Comparator 来实现 Key 的去重。这个信息非常重要,因为如果没有覆盖正确的方法,那么则无法将 TreeMap 的最大特性发挥出来。TreeMap 内部对 Key 排序调用了如下方法:
final int compare(Object k1, Object k2) {
return comparator==null ? ((Comparable<? super K>)k1).compareTo((K)k2)
: comparator.compare((K)k1, (K)k2);
}
可以看到,如果 comparator 不为 null,优先使用比较器 comparator 的 compare 方法,如果为 null 则使用 Key 实现的自然排序 Comparable 接口的 compareTo 方法。如果两者都无法满足,则抛出异常。