基于 NavigableMap 红黑树的实现。映射根据其键的 自然顺序 进行排序,或者根据使用哪个构造函数在映射创建时提供排序 Comparator 。
此实现为 、 getput 和 remove 操作提供了有保证的 containsKeylog(n) 时间成本。算法是对 Cormen、Leiserson 和 Rivest 的 Introduction to Algorithms 中的算法的改编。
请注意,树状图维护的排序(与任何排序的映射一样)以及是否提供显式比较器都必须与equals此排序映射是否正确实现Map接口一致。(有关“与等于一致”的精确定义,请参见 Comparable 或Comparator。之所以如此,是因为Map接口是根据equals操作定义的,但排序映射使用其 compareTo (or compare) 方法执行所有键比较,因此从排序映射的角度来看,此方法认为相等的两个键是相等的。排序映射的行为是明确定义的,即使它的顺序与equals;它只是不遵守接口的一般Map契约。
请注意,此实现不是同步的。 如果多个线程同时访问一个映射,并且至少有一个线程在结构上修改了映射 ,则必须在 外部同步该映射。(结构修改是添加或删除一个或多个映射的任何操作;仅更改与现有键关联的值不是结构修改。这通常是通过在自然封装地图的某个对象上进行同步来实现的。如果不存在此类对象,则应使用该 Collections.synchronizedSortedMap 方法“包装”映射。最好在创建时执行此操作,以防止意外的不同步访问地图:

SortedMap m = Collections.synchronizedSortedMap(new TreeMap(...));

由此类的所有“集合视图方法”返回的集合的方法返回 iterator 的迭代器是 快速失败的:如果在创建迭代器后的任何时间对映射进行结构修改,则 remove 迭代器将抛出一个 ConcurrentModificationException.因此,在面对并发修改时,迭代器会快速而干净地失败,而不是冒着在未来不确定的时间出现任意的、非确定性行为的风险。
请注意,无法保证迭代器的快速失效行为,因为一般来说,在存在不同步的并发修改的情况下,不可能做出任何硬性保证。快速失败的迭代器 ConcurrentModificationException 会尽力而为。因此,编写一个依赖于此异常的程序的正确性是错误的: 迭代器的快速失败行为应该只用于检测错误。
此类中的方法及其视图返回的所有 Map.Entry 对都表示生成映射时映射的快照。他们 不支持 该 Entry.setValue 方法。(但请注意,可以使用以下命令 put更改关联映射中的映射。

排序

public NavigableSet<K> descendingKeySet() {  
    return descendingMap().navigableKeySet();  
}

可以对Key进行排序