Collection源码解读

Collection源码解读
Collection就是一组同类型的元素。
这个接口干啥的?传递各种集合并且提供一些通用的方法
怎么用?大部分集合类都是间接使用这个类,通过其子接口但要实现两个构造器:
一个是用来创建一个空的Collection,另一个是可以放置相同类型元素的Collection。
出现的异常 UnsupportedOperationException,往一个不可变的集合里加元素就会出现
NullPointerException 空指针异常
ClassCastException 类转换异常

JDK1.2

public interface Collection<E> extends Iterable<E> {

//查询操作
int size();

返回元素个数。值的范围受int约束MAX_VALUE = 0x7fffffff 2的31次方 减一

boolean isEmpty();

判断是否含有元素,如果没有元素就返回true

boolean contains(Object o);

判断是否含有指定的元素 o
这里有个小疑问?为什么是Object而不是泛型E呢。这里面存的都是Object呀。细看源码介绍
A collection represents a group of objects, known as its elements.
还要一些个人的理解,这里需要判断是否包含这个元素归根结底就是比较,就是equals方法,hashcode那么object类就是最好的选择。

Iterator<E> iterator();

返回一个迭代器,这个方法继承自iterable

Object[] toArray();

将Collection里元素变成一个Object的数组,但之后这个数组就与这个Collection无关了。该方法是未引入泛型时的方法,容易产生类型转换的问题,编译的时候还不会报错。

<T> T[] toArray(T[] a);

是上一个ToArray()的优化,区别就在于其使用了泛型,对类型有一个更严格的限制,这个类型是运行时的类型。为什么还需要一个参数a,用来为数组分配空间使用的,假如返回一个String的数组,长度为三,如何定义这个长度呢?就是使用toArray(new String[3])。
个人认为就是方便类型之间的转换。之前那个Object[]有点不实用。

//修改接口

boolean add(E e);

往collection里加一个元素,这里使用了泛型。就是确保collection里有这个特定元素,如果添加失败或者已经存在这个元素了就返回false。在这里需要使用泛型,因为需要一个准确的类型。

boolean remove(Object o);

从这个collection中移除一个特定元素的实例。此处使用Object也是为了比较查找,同理cotains()方法。

//批量操作

boolean containsAll(Collection<?> c);

是否还包含Collection<?>里的所有元素

boolean addAll(Collection<? extends E> c);

往自身的collection里添加指定collection里的所有元素。在进行添加的过程中要保证c不发生改变。

boolean removeAll(Collection<?> c);

从原collection里移除指定collection里的所有元素

default boolean removeIf(Predicate<? super E> filter) {

根据限制条件删除元素,只要有一个满足的元素被删除就返回true。内部使用迭代器进行遍历然后删除。
JDK1.8实现

boolean retainAll(Collection<?> c);

仅保留c里的元素,别的元素全部删除。

void clear();

删除所有元素

//比较和hash

boolean equals(Object o);

比较指定的o是否和本身collection相等

int hashCode();

为本身这个collection生成一个hash值

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

继承自iterable接口的分割迭代器

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

把本身collection当作源,生成一个流。
jdk1.8(流式处理)

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

把本身collection当作源,生成一个并行流。


版权声明:本文为weixin_42194515原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。