# SortedMap 接口

> 原文： [https://docs.oracle.com/javase/tutorial/collections/interfaces/sorted-map.html](https://docs.oracle.com/javase/tutorial/collections/interfaces/sorted-map.html)

[`SortedMap`](https://docs.oracle.com/javase/8/docs/api/java/util/SortedMap.html) 是 [`Map`](https://docs.oracle.com/javase/8/docs/api/java/util/Map.html) ，它按升序保持其条目，根据键的自然顺序排序，或根据时间提供的`Comparator`排序`SortedMap`创作。自然排序和`Comparator`在[对象排序](order.html)部分中讨论。 `SortedMap`接口为正常`Map`操作和以下操作提供操作：

*   `Range view` - 对已排序的地图执行任意范围操作
*   `Endpoints` - 返回有序映射中的第一个或最后一个键
*   `Comparator access` - 返回用于对地图进行排序的`Comparator`（如果有）

以下接口是 [`SortedSet`](https://docs.oracle.com/javase/8/docs/api/java/util/SortedSet.html) 的`Map`模拟量。

```
public interface SortedMap<K, V> extends Map<K, V>{
    Comparator<? super K> comparator();
    SortedMap<K, V> subMap(K fromKey, K toKey);
    SortedMap<K, V> headMap(K toKey);
    SortedMap<K, V> tailMap(K fromKey);
    K firstKey();
    K lastKey();
}

```

## 地图操作

从`Map`继承的操作`SortedMap`在排序的地图和法线贴图上表现相同，但有两个例外：

*   `iterator`操作在任何有序地图的`Collection`视图上返回的`Iterator`按顺序遍历集合。
*   `Collection`视图'`toArray`操作返回的数组按顺序包含键，值或条目。

虽然接口无法保证，但所有 Java 平台的`SortedMap`实现中的`Collection`视图的`toString`方法按顺序返回包含视图所有元素的字符串。

## 标准构造者

按照惯例，所有通用`Map`实现都提供了一个标准转换构造函数，它采用`Map`; `SortedMap`实现也不例外。在`TreeMap`中，此构造函数创建一个实例，根据其键的自然顺序对其条目进行排序。这可能是一个错误。最好动态检查以查看指定的`Map`实例是否为`SortedMap`，如果是，则根据相同的标准（比较器或自然排序）对新地图进行排序。因为`TreeMap`采用了它所做的方法，它还提供了一个构造函数，它接受`SortedMap`并返回一个新的`TreeMap`，它包含与给定`SortedMap`相同的映射，按照相同的标准排序。请注意，它是参数的编译时类型，而不是其运行时类型，它确定是否优先于普通`map`构造函数调用`SortedMap`构造函数。

按照惯例，`SortedMap`实现还提供了一个构造函数，它接受`Comparator`并返回根据指定的`Comparator`排序的空映射。如果`null`传递给此构造函数，它将返回`Map`，根据其键的自然顺序对其映射进行排序。

## 与 SortedSet 的比较

由于此接口是`SortedSet`的精确`Map`模拟，因此 [SortedSet 接口](sorted-set.html)部分中的所有习语和代码示例仅适用于`SortedMap`，只需进行微小的修改。