JDK源码分析Iterable和Collection接口

java集合的类图 如图

image-20210221143450121

Iterable和Collection接口做为顶级接口,那么要想解析集合包,就从他们开始.

Iterable接口

作用

image-20210221122324681

此接口算是一个标识,实现此接口则能达到成为foreach目标的效果

方法

image-20210221120852210

返回一个迭代器

1
Iterator<T> iterator();

对内部元素进行遍历 1.8NEW

1
2
3
4
5
6
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}

image-20210221124144271

1
2
3
4
5
public static <T> T requireNonNull(T obj) {
if (obj == null)
throw new NullPointerException();
return obj;
}

此方法先调用Objects的方法查验传入的泛型是否为空,否则就抛出异常,与接口的注释意思一致

在当前元素上创建一个分离器 1.8NEW

1
2
3
default Spliterator<T> spliterator() {
return Spliterators.spliteratorUnknownSize(iterator(), 0);
}

关于分离器:

​ 分离器是用于遍历和划分源元素的对象。说白了就是创建一个并行迭代器,满足当前多cpu高性能的需求。

default关键字 1.8NEW

这俩个1.8新加上的接口都用了default修饰,此修饰词也是1.8加上的,代表实现接口的类可以不实现此修饰词修饰的方法.

Collection接口

说明

  1. 集合的根接口
  2. 无法直接实现此接口,只能实现其特定子接口
  3. 此接口用于最大化的操纵集合
  4. Collection 接口存储一组不唯一,无序的对象。

常用的方法

  1. public boolean add(E e):添加一个元素

  2. public void clear():清空集合中所有的元素

  3. public boolean remove(E e):移除集合中指定的元素

  4. public boolean contains(E e):检查集合中是否包含指定的对象

  5. public boolean isEmpty():判断集合是否为空

  6. public void size():判断集合中元素的个数

  7. public Object[] toArray():把集合元素存储到数

组中

1.8加入的方法

  1. ```
    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;
    }
    
    1
    2
    3
    4
    5
    6
    7

    删除此集合中满足给定*谓词的所有元素。

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

    在当前元素上创建一个分离器

  2. ```
    default Stream stream() {

    return StreamSupport.stream(spliterator(), false);
    

    }

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11



    返回以该集合为源的顺序{



    4. ```
    default Stream<E> parallelStream() {
    return StreamSupport.stream(spliterator(), true);
    }

    返回与此集合作为其源的可能并行的{@code Stream}。此方法允许返回顺序流。