jdk源码追踪-Collection

Collection

Collection接口是java最基础,重要的接口之一,它有ListSetQueue等Java最常用的子接口,这里主要解析Collection这个接口以及它最常用的类的源码实现。

jdk源码追踪-Collection_第1张图片

上面是collection的类图

Collection是集合的父接口,它规约了集合有add(E e)remove(Object o)size()toArray()iterator()splitIterator()stream()这些基本操作。其中splitIterator()stream()是java8提供的新方法,stream()的作用是流式处理,它实现了lamda表达式;splitIterator()是分段的迭代器,满足支持多线程对Collection的遍历,而iterator()`是顺序的。

public interface Collection extends Iterable {
 
    int size();
    boolean isEmpty();
    boolean contains(Object o);
    Iterator iterator();
    Object[] toArray();
     T[] toArray(T[] a);
    boolean add(E e);
    boolean remove(Object o);
    boolean containsAll(Collection c);
    boolean addAll(Collection c);
    boolean removeAll(Collection c);
    
    default boolean removeIf(Predicate filter) {
        Objects.requireNonNull(filter);
        boolean removed = false;
        final Iterator each = iterator();
        while (each.hasNext()) {
            if (filter.test(each.next())) {
                each.remove();
                removed = true;
            }
        }
        return removed;
    }
    boolean retainAll(Collection c);
    void clear();
    boolean equals(Object o);
    int hashCode();
    
    @Override
    default Spliterator spliterator() {
        return Spliterators.spliterator(this, 0);
    }

    default Stream stream() {
        return StreamSupport.stream(spliterator(), false);
    }

    default Stream parallelStream() {
        return StreamSupport.stream(spliterator(), true);
    }
}

stream()splitIterator()方法在Collection接口中是有默认实现的,这是java8的新语法,即接口方法也可以有默认实现,查看stream()源码可知,stream()采用的是分段迭代器,故而,它在多线程的效率会高。

default Spliterator spliterator() {
    return Spliterators.spliterator(this, 0);
}
default Stream stream() {
    return StreamSupport.stream(spliterator(), false);
}

在看Collection子类源码的时候,才发现java的实现真的遵守设计的想法

  • List是有序列,所有List有基于index的操作。
  • ArrayList是基于数组的实现,(所有的实现都基于数组,包括Iterator也是自己实现的内部类,next()实际是通过数组遍历得到),ArrayList适用于随机访问数据。
  • LinkedList是基于链表的实现,Iterator通过listIterator的实现迭代器。
  • Set是无序列,所以Set接口中没有对下标index的操作。

AbstractCollection

AbstractCollectionCollection实现类,也是所有Collection具体实现类的父类,它使用模版方法模式通过调用add()remove()等抽象方法实现了addAll()removeAll()retainAll()clear()toString()的算法。

你可能感兴趣的:(JAVA基础,java.util源码解析,Collection接口,源码)