JDK1.8源码解读之 SortedSet

232 阅读4分钟

前言

  • {@link Set}进一步提供了其元素的总体排序。
  • 元素使用其 可比自然排序 或通常在排序集创建时提供的 Comparator 进行排序。
  • 集合的迭代器将以升序顺序遍历集合。提供了一些附加操作以利用排序的优势。
  • (此接口和{@link SortedMap}的类似。)
  • 插入排序集中的所有元素都必须实现Comparable接口(或被指定的比较器接受)。
  • 此外,所有这些元素必须相互可比较:e1.compareTo(e2)(或比较器.compare(e1,e2))
  • 不得为已排序集中的任何元素e1和e2 抛出ClassCastException。
  • 尝试违反此限制将导致有问题的方法或构造函数调用引发ClassCastException。
  • 请注意,如果排序集要正确实现Set接口,则排序集(无论是否提供显式比较器)所维护的顺序必须与equals一致。
  • (有关与equals一致的精确定义,请参见Comparable接口或Comparator接口。)
  • 之所以这样,是因为Set接口是根据equals操作定义的,但是排序后的set使用其compareTo(或compare)方法执行所有元素比较。
  • 因此从排序集的角度来看,此方法认为相等的两个元素相等。
  • 即使排序集的排序与equals不一致,也可以很好地定义其行为。它只是不遵守Set接口的一般约定。
  • 所有通用排序集实现类都应提供四个“标准”构造函数:
  • 1)一个void(无参数)构造函数,该构造函数将创建一个空的排序集,并根据其元素的自然顺序对其进行排序。
  • 2)具有一个Comparator类型的单个参数的构造函数,该构造函数创建一个空的排序集,该集根据指定的比较器排序。
  • 3)具有单个Collection类型参数的构造函数,该构造函数将创建一个新的排序集合,该集合具有与其参数相同的元素,并根据元素的自然顺序进行排序。
  • 4)具有单个类型为SortedSet的参数的构造函数,该构造函数将创建一个新的排序集合,其元素与输入排序集合的元素和排序相同。由于接口不能包含构造函数,因此无法强制执行此建议。
  • 注意:几种方法返回范围受限的子集。
  • 这样的范围是半开的,也就是说,它们包括其低端点,但不包括其高端点(如果适用)。
  • 如果您需要一个封闭范围(包括两个端点),并且元素类型允许计算给定值的后继对象,则只需请求从lowEndpoint到后继对象(highEndpoint)的子范围。

源码

public interface SortedSet<E> extends Set<E> {
    /**
     * 返回用于对集合中的元素进行排序的比较器;如果此集合使用其元素的{@linkplain可比自然排序},则返回null。
     */
    Comparator<? super E> comparator();

    /**
     * 返回此集合部分的视图,其元素范围从fromElement(包括)到toElement(不包括)。
     * (如果fromElement和toElement相等,则返回的集合为空。)
     * 返回的集合受该集合支持,因此返回的集合中的更改将反映在该集合中,反之亦然。
     * 返回的集合支持该集合支持的所有可选集合操作。
     * 尝试插入超出其范围的元素时,返回的集合将引发IllegalArgumentException。
     */
    SortedSet<E> subSet(E fromElement, E toElement);

    /**
     * 返回此集合中元素严格小于toElement的部分的视图。
     * 返回的集合受此集合支持,因此返回的集合中的更改将反映在此集合中,反之亦然。
     * 返回的集合支持该集合支持的所有可选集合操作。
     * 尝试插入超出其范围的元素时,返回的集合将引发IllegalArgumentException。
     */
    SortedSet<E> headSet(E toElement);

    /**
     * 返回此集合中元素大于或等于fromElement的部分的视图。
     * 返回的集合受此集合支持,因此返回的集合中的更改将反映在此集合中,反之亦然。
     * 返回的集合支持该集合支持的所有可选集合操作。尝试插入超出其范围的元素时,返回的集合将引发IllegalArgumentException。
     */
    SortedSet<E> tailSet(E fromElement);

    /**
     * Returns the first (lowest) element currently in this set.
     * 返回此集中当前的第一个(最低)元素。
     * @return the first (lowest) element currently in this set
     * @throws NoSuchElementException if this set is empty
     */
    E first();

    /**
     * 返回当前在此集合中的最后一个(最高)元素。
     */
    E last();

    /**
     * 在此排序集中的元素上创建一个{@code Spliterator}。
     */
    @Override
    default Spliterator<E> spliterator() {
        return new Spliterators.IteratorSpliterator<E>(
                this, Spliterator.DISTINCT | Spliterator.SORTED | Spliterator.ORDERED) {
            @Override
            public Comparator<? super E> getComparator() {
                return SortedSet.this.comparator();
            }
        };
    }
}

```