JDK1.8源码解读之 SortedMap

371 阅读5分钟

前言

  • {@link Map}进一步提供了其key的总排序。
  • map是根据其 key 的 可比自然排序 进行排序的,或者通常是在已排序的 map 创建时提供的 Comparator 进行排序的。
  • 排序反映在 遍历排序后的map的集合视图 中(由 entrySet,keySet 和 values 方法返回)。
  • 提供了一些附加操作以利用排序的优势。
  • 插入已排序映射中的所有键都必须实现{@code Comparable}接口(或被指定的comparator)。
  • 此外,所有key必须相互可比较:
  • k1.compareTo(k2)或 comparator.compare(k1,k2)不得为任何key k1和k2 抛出 ClassCastException。
  • 尝试违反此限制将导致违规方法或构造函数调用抛出 ClassCastException。
  • 请注意,如果sorted map要正确实现{@code Map}接口,则sorted map(无论是否提供显式比较器)所维护的顺序必须与equals一致。
  • (请参见{@code Comparable}接口或{@code Comparator}接口,以获取与equals一致的精确定义。)
  • 之所以这样,是因为{@code Map}接口是根据{@code equals}操作定义的,
  • 但是sorted map使用其{@code compareTo}(或{@code compare})方法执行所有键比较,
  • 因此,从sorted map的角度来看,此方法认为相等的两个键是相等的。
  • tree map 的行为是明确定义的,即使其顺序与equals不一致也是如此;它只是无法遵守{@code Map}接口的一般约定。
  • 所有通用sorted map实现类都应提供四个“标准”构造函数。
  • 尽管由于接口无法指定所需的构造函数,所以无法实施此建议。所有sorted map 实现的预期“标准”构造函数为:
  • 1, 一个默认的无参的构造函数,该方法可以根据key的自然排序,创建一个空的sorted map
  • 2, 一个构造器,只有一个参数,就是它的Comparator。该方法根据指定的比较器,创建了一个空的sorted map
  • 3, 一个构造器,只有一个参数,map。该方法根据map提供的key-value,和自然排序,来创建一个sorted map
  • 4,一个狗仔起,只有一个参数,sortedMap,该方法创建了一个sorted map,和原sroted map具有一致的key-value,和相同的排序。
  • 注意:几种方法会返回键范围受限的子map。
  • 这样的范围是半开的,也就是说,它们包括其低端点,但不包括其高端点(如果适用)。
  • 如果您需要一个封闭范围(包括两个端点),并且key类型允许计算给定key的后继者,
  • 只需请求从{@code lowEndpoint}到{@code successor(highEndpoint)}的子范围。

源码

public interface SortedMap<K,V> extends Map<K,V> {
   
    Comparator<? super K> comparator();

    /**
     * 返回此地map部分的视图,其键值范围从{@code fromKey}(包括)到{@code toKey}(不包括)。
     * (如果{@code fromKey}和{@code toKey}相等,则返回的映射为空。)
     * 此映射支持返回的映射,因此返回映射中的更改将反映在该映射中,反之亦然。
     * 返回的map支持该map支持的所有可选map操作。
     * 在返回的map里面插入一个超出范围的key会抛出 IllegalArgumentException 异常。
     *
     */
    SortedMap<K,V> subMap(K fromKey, K toKey);

    /**
     * 返回此map部分的视图,其键严格小于{@code toKey}。
     * 返回的 map 受此 map 支持,因此返回的 map 中的更改会反映在此 map 中,反之亦然。
     * 返回的 map 支持该 map 支持的所有可选 map 操作。
     *
     * 在返回的map里面插入一个超出范围的key会抛出 IllegalArgumentException 异常。
     *
     */
    SortedMap<K,V> headMap(K toKey);

    /**
     * 返回此映射的一部分的视图,其键大于或等于{@code fromKey}。
     * 返回的map受此map支持,因此返回的map中的更改会反映在此map中,反之亦然。
     * 返回的map支持该map支持的所有可选map操作。
     * 在返回的map里面插入一个超出范围的key会抛出 IllegalArgumentException 异常。
     *
     */
    SortedMap<K,V> tailMap(K fromKey);

    /**
     * 返回当前map中的第一个key
     */
    K firstKey();

    /**
     * 返回当前map中最后一个key
     */
    K lastKey();

    /**
     * 返回此映射中包含的键的{@link Set}视图。
     * 集合的迭代器以升序返回键。该集合由map支持,因此对map的更改会反映在集合中,反之亦然。
     * 如果在对集合进行迭代时修改了映射(通过迭代器自己的{@code remove}操作除外),则迭代的结果是不确定的。
     * 该集合支持元素删除,该元素删除通过 Iterator.remove,Set.remove,removeAll,keepAll 和 clear 操作。
     * 它不支持 add 或 addAll 操作。
     */
    Set<K> keySet();

    /**
     * 返回此映射中包含的值的{@link Collection}视图。
     * 集合的迭代器按相应键的升序返回值。集合由map支持,因此对map的更改会反映在集合中,反之亦然。
     * 如果在对集合进行迭代时修改了map(通过迭代器自己的{@code remove}操作除外),则迭代的结果是不确定的。
     * 该集合支持元素删除,该元素删除通过 Iterator.remove,Set.remove,removeAll,keepAll 和 clear 操作。
     * 它不支持 add 或 addAll 操作。
     */
    Collection<V> values();

    /**
     * 返回此映射中包含的映射的{@link Set}视图。集合的迭代器按升序返回条目。
     * 该集合由map支持,因此对map的更改会反映在集合中,反之亦然。
     * 如果在对集合进行迭代时修改了map(通过迭代器自己的{@code remove}操作除外),则迭代的结果是不确定的。
     * 该集合支持元素删除,该元素删除通过 Iterator.remove,Set.remove,removeAll,keepAll 和 clear 操作。
     * 它不支持 add 或 addAll 操作。
     */
    Set<Map.Entry<K, V>> entrySet();
}

```