Collection接口是java最基础,重要的接口之一,它有List
,Set
,Queue
等Java最常用的子接口,这里主要解析Collection这个接口以及它最常用的类的源码实现。
上面是collection的类图
Collection是集合的父接口,它规约了集合有add(E e)
,remove(Object o)
,size()
,toArray()
,iterator()
,splitIterator()
,stream()
这些基本操作。其中splitIterator()
,stream()
是java8提供的新方法,stream()
的作用是流式处理,它实现了lamda表达式;splitIterator()
是分段的迭代器,满足支持多线程对Collection的遍历,而
iterator()`是顺序的。
public interface Collection<E> extends Iterable<E> {
int size();
boolean isEmpty();
boolean contains(Object o);
Iterator<E> iterator();
Object[] toArray();
<T> T[] toArray(T[] a);
boolean add(E e);
boolean remove(Object o);
boolean containsAll(Collection<?> c);
boolean addAll(Collection<? extends E> c);
boolean removeAll(Collection<?> c);
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;
}
boolean retainAll(Collection<?> c);
void clear();
boolean equals(Object o);
int hashCode();
@Override
default Spliterator<E> spliterator() {
return Spliterators.spliterator(this, 0);
}
default Stream<E> stream() {
return StreamSupport.stream(spliterator(), false);
}
default Stream<E> parallelStream() {
return StreamSupport.stream(spliterator(), true);
}
}
stream()
和splitIterator()
方法在Collection接口中是有默认实现的,这是java8的新语法,即接口方法也可以有默认实现,查看stream()
源码可知,stream()
采用的是分段迭代器,故而,它在多线程的效率会高。
default Spliterator<E> spliterator() {
return Spliterators.spliterator(this, 0);
}
default Stream<E> stream() {
return StreamSupport.stream(spliterator(), false);
}
在看Collection子类源码的时候,才发现java的实现真的遵守设计的想法
AbstractCollection
是Collection
实现类,也是所有Collection
具体实现类的父类,它使用模版方法模式通过调用add()
,remove()
等抽象方法实现了addAll()
,removeAll()
,retainAll()
,clear()
,toString()
的算法。