欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【JDK1.8源码剖析】Collection接口

程序员文章站 2022-05-19 16:09:33
...

Collection源码剖析

(一)简介

Collection接口是集合层次结构中的根接口。

(1)下面是常用集合类关系图

Collection
  |___List  有序,可重复
    |___ArrayList  
    |___LinkedList 
    |___Vector  
  |___Set  无序,不可重复
    |___HashSet
    |___TreeSet

JDK不提供此接口的任何直接实现:它提供了更具体的子接口(如Set和List)的实现。

(2)Collection的继承体系
【JDK1.8源码剖析】Collection接口

关于Iterable的源码剖析,我们已经进行过了【JDK1.8源码剖析】内部迭代器 Iterable接口,它使得实现类能够使用forEach方法进行遍历。

(二)源码分析

考虑到是接口,除了默认方法没有具体的实现,我们首先看看它有哪些东西:
【JDK1.8源码剖析】Collection接口

int size():返回此集合中的元素数量
boolean isEmpty():判断集合元素是否为空
boolean contains(Object o):判断此集合是否包含指定的元素,包含则返回true,反之
Iterator<E> iterator():返回此集合中元素的迭代器,不保证元素返回的顺序(除非此集合是提供保证的某个类的实例)。
Object[] toArray():将此集合中的元素转换成数组并返回该数组,该方法作为基于数组和集合之间的桥梁的api
<T> T[] toArray(T[] a):返回指定类型数组
boolean add(E e):此集合添加指定元素
boolean remove(Object o):删除指定元素
boolean containsAll(Collection<?> c):判断是否包含特定集合,如果存在则返回true 反之
boolean addAll(Collection<? extends E> c):添加指定集合
boolean removeAll(Collection<?> c):删除指定集合
default boolean removeIf(Predicate<? super E> filter):移除此集合中满足给定条件的所有元素
boolean retainAll(Collection<?> c):仅保留指定类型的集合
void clear():清空集合元素
boolean equals(Object o):将指定的对象与此集合进行相等性较
int hashCode():返回集合的哈希值,用于比较相等与否
default Spliterator<E> spliterator():继承自Iterable,内部迭代器还可转换为可分割迭代器Spliterator

依次看一下默认方法:移除此集合中满足给定条件的所有元素

    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;
    }

Predicate<T> 为断定型函数式接口,确定类型为T的对象是否满足某约束,并返回boolean 值。

Lambda表达式参考这篇文章【Java 8 in Action】Lambda表达式,非常详尽且有实战。

同样,我们在【Java 8 in Action】Stream中探讨了Stream的创建,其中一条就是 通过集合的stream()方法或者parallelStream()。

spliterator()的使用参考:

JAVA8流中Spliterator的使用(一)

JAVA8 stream 中Spliterator的使用(二)

    default Stream<E> stream() {
        return StreamSupport.stream(spliterator(), false);
    }
    default Stream<E> parallelStream() {
        return StreamSupport.stream(spliterator(), true);
    }
相关标签: JDK源码剖析