源码学习之Collection

以下源码摘自JDK8

package java.util;

import java.util.function.Predicate;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;

/**
 * 集合里的根接口。集合是一组元素。有些集合允许重复的值,有些集合不允许。有些集合是顺序的,
 * 有些则不是。JDK里,Collection接口没有任何直接实现,需要通过其子接口List和Set来实现。
 *
 * 所有通用Collection实现类(即从Collection的子接口实现)需提供两个标准的构造器,一个空参
 * 构造器和一个带有Collection类入参的构造器,Collection入参构造器会根据入参的元素来创建集合。
 *
 * 每个collection可以自己定义自己的同步策略。collection类的default方法不包含任何
 * synchronization策略。实现类需重写default方法来实现同步。
 *
 * @param <E> the type of elements in this collection
 *
 * @author  Josh Bloch
 * @author  Neal Gafter
 * @see     Set
 * @see     List
 * @see     Map
 * @see     SortedSet
 * @see     SortedMap
 * @see     HashSet
 * @see     TreeSet
 * @see     ArrayList
 * @see     LinkedList
 * @see     Vector
 * @see     Collections
 * @see     Arrays
 * @see     AbstractCollection
 * @since 1.2
 */

public interface Collection<E> extends Iterable<E> {
    // Query Operations 查询操作
    /**
     * 返回Collection中元素的个数,如果个数大于Integer的最大值,则返回MAX_INT
     */
    int size();

    /**
     * 为空返回true,否则返回false
     */
    boolean isEmpty();

    /**
     * 判断元素是否存在集合中,可能抛出类型转换异常或空指针异常。
     */
    boolean contains(Object o);

    /**
     * 继承于Iterable接口
     */
    Iterator<E> iterator();

    /**
     * 返回一个包含所有元素的数组。如果collection是有序的,则数组的顺序必须与之相同。
     * 该方法会创建一个新的数组,是数组与集合之间的桥梁。
     */
    Object[] toArray();

    /**
     * 支持泛型的toArray();
     */
    <T> T[] toArray(T[] a);

    // Modification Operations 修改操作

    /**
     * 将元素添加进collection,成功返回true,失败返回false。失败的原因可能是collection
     * 不允许添加重复的元素,可能是不允许添加null值。如果不是因为已经包含元素的原因添加失败,
     * 必须抛出异常。这保证了这常调用该函数后,collectin必然包含需要添加的值。
     * @throws UnsupportedOperationException 如果集合不支持add操作。
     * @throws ClassCastException 转换类型失败
     * @throws NullPointerException 集合
     * @throws IllegalArgumentException 元素不允许被添加
     * @throws IllegalStateException
     */
    boolean add(E e);

    /**
     * 删除入参元素,如果有多个则删除多个。正常运行后,collection必然不含入参元素。
     * @throws ClassCastException
     * @throws NullPointerException 如果入参为null,且集合不允许null
     * @throws UnsupportedOperationException 集合不允许remove()操作
     */
    boolean remove(Object o);


    // Bulk Operations 块操作

    /**
     * 如果包含入参中所有的元素则返回true,否则false。
     * @throws ClassCastException
     * @throws NullPointerException
     */
    boolean containsAll(Collection<?> c);

    /**
     * 添加所有元素。
     * @throws UnsupportedOperationException collection不支持此方法。
     * @throws ClassCastException
     * @throws NullPointerException
     * @throws IllegalArgumentException 入参的元素不支持被添加
     * @throws IllegalStateException
     */
    boolean addAll(Collection<? extends E> c);

    /**
     * 删除所有元素。
     * @throws UnsupportedOperationException
     * @throws ClassCastException
     * @throws NullPointerException
     */
    boolean removeAll(Collection<?> c);

    /**
     * 移除集合里所有满足条件的元素。
     * 默认实现使用其迭代器遍历所有元素,对于满足条件的的元素,使用迭代器的remove操作。如果迭代器
     * 不支持删除操作,遇到第一个满足条件的元素抛出UnsupportedOperationException异常。
     * @throws NullPointerException filter为null
     * @throws UnsupportedOperationException
     */
    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;
    }

    /**
     * 保留包含在给定collection里的元素。等同于移除所有不在入参集合里的元素。
     * @throws UnsupportedOperationException
     * @throws ClassCastException
     * @throws NullPointerException
     */
    boolean retainAll(Collection<?> c);

    /**
     * 移除所有元素,collection为empty
     * @throws UnsupportedOperationException
     */
    void clear();


    // Comparison and hashing

    boolean equals(Object o);

    int hashCode();

    /**
     * 新建Spliterator,基于collection的元素。
     * @since 1.8
     */
    @Override
    default Spliterator<E> spliterator() {
        return Spliterators.spliterator(this, 0);
    }

    /**
     * @since 1.8
     */
    default Stream<E> stream() {
        return StreamSupport.stream(spliterator(), false);
    }

    /**
     * @since 1.8
     */
    default Stream<E> parallelStream() {
        return StreamSupport.stream(spliterator(), true);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值