Java Collect详解 - TongtongLan/Java GitHub Wiki

集合层次结构中的根接口。一个集合表示一组对象,称为其元素。一些集合允许重复的元素,而另一些则不允许一些被命令和其他无序。 JDK不提供这个接口的任何直接实现:它提供了更多特定子接口的实现,比如Set和List。这个接口通常用于传递集合,并在需要最大化普遍性时对其进行操作。

所有通用的Collection实现类(通常通过其一个子接口间接地实现Collection)应该提供两个“标准”构造函数:一个void(无参数)构造函数,它创建一个空集合,以及一个具有单类型参数的构造函数集合,它创建一个与它的参数具有相同元素的新集合。实际上,后者的构造函数允许用户复制任何集合,生成所需实现类型的等效集合。没有办法执行这个约定(因为接口不能包含构造函数),但是Java平台库中的所有通用Collection实现都符合。

Implementation Requirements:

The default method implementations (inherited or otherwise) do not apply any synchronization protocol. If a Collection implementation has a specific synchronization protocol, then it must override default implementations to apply that protocol.

collection 接口继承了一个接口 Iterator, 并重写了接口的两个方法:

public interface Collection<E> extends Iterable<E>

default Spliterator<E> spliterator()

@Override
default Spliterator<E> spliterator() {
    return Spliterators.spliterator(this, 0);
}

Iterator<E> iterator();

对于Spliterator接口的设计思想,应该要提到的是Java7的Fork/Join(分支/合并)框架,总得来说就是用递归的方式把并行的任务拆分成更小的子任务,然后把每个子任务的结果合并起来生成整体结果。带着这个理解来看看Spliterator接口提供的方法,可见Java diference between java.lang.spliterator and java.lang.Iterator and java.lang.Iterable

collection 接口中,spliterator()方法调用了Spliterators类中static方法spliterator(...),以返回一个Spliterator实例。

ABOUT 静态方法spliterator(...)

  • 一个重载在方法,在调用时采用方法动态分派,根据传入参数类型确定具体调用的方法。

  • 工厂模式,创建Spliterators类中,实现Spliterator接口的默认静态内部类实例。这些类仅实现了Spliterator接口声明的四个方法并提供两个有参构造方法。包括:

static final class ArraySpliterator<T> implements Spliterator<T>

static final class IntArraySpliterator implements Spliterator.OfInt

static final class LongArraySpliterator implements Spliterator.OfLong

static final class DoubleArraySpliterator implements Spliterator.OfDouble

java 1.8 中还提供了一种default方法,用于根据传入谓词对集合对象筛选。具体实现采用迭代器及remove()方法。

removeIf(Predicate<? super E> filter)

default boolean removeIf(Predicate<? super E> filter) {
    Objects.requireNonNull(filter);
    boolean removed = false;
    final Iterator<E> each = iterator();
    while (each.hasNext()) {
        if (filter.test(each.next())) {
            each.remove();
            removed = true;
        }
    }
    return removed;
}
⚠️ **GitHub.com Fallback** ⚠️