本文章帮助大家对Collection
接口的理解。
Collection
意为集合(无特殊说明,本文章“集合”指Collection
)。顾名思义,就是同一类对象(元素)的集合体。无论是否有重复的元素,只要是需要使用符合集合体特性的,建议实现此接口。
package java.util;
import java.util.Collection;
使用Collection
接口时,需引入此包。
public interface Collection<E> extends Iterable<E> { /*...*/ }
使用接口时传入泛型E
,为可迭代集合的元素的类型。继承了Iterable
接口,使集合具有遍历元素的功能,重点为iterator
方法。参考Iterable
接口。
注意:要求其实现类遵守如此规定:需实现两个构造函数:一个无参数构造函数,以创建一个空集合;一个参数为Collection
类型的构造函数,以创建一个具有和参数相同元素的集合。但由于接口不能包含构造函数,所以无法强制执行此规定。
但Java平台库中的所有通用集合实现都符合此约定。
int size();
返回元素个数。若集合包含元素个数大于Integer.MAX_VALUE
,则返回Integer.MAX_VALUE
。
boolean isEmpty();
判断集合是否为空。
boolean equals(Object o);
重写Object
类的boolean equals(Object obj)
方法,参考Object.equals
方法。
判断集合和对象o
是否相同/相等。
注意:集合的不同实现的比较,应该返回false
。
int hashCode();
重写Object
类的int hashCode()
方法,参考Object.hashCode
方法。
返回此集合的哈希码。
Iterator<E> iterator();
重写Iterable
接口的Iterator
方法,参考Iterable.iterator
方法。
重点:为使实现Collection
接口的类对象可以遍历元素,需要实现类自定义迭代方法,即实现此方法以返回迭代器。而要使用自定义迭代器,需实现Iterator
接口的hasNext
、next
方法。参考Iterator
接口。
default Spliterator<E> spliterator() { return Spliterators.spliterator(this, 0); }
重写Iterable
的Spliterator
方法,参考Iterable.Spliterator
方法。
返回覆盖此集合元素的分割迭代器,可用来遍历、分割序列。参考Spliterators.spliterator
方法。default
关键字给出默认实现。
default Stream<E> stream() { return StreamSupport.stream(spliterator(), false); }
返回以此集合作为其源的序列流。default
关键字给出默认实现。
注意:当spliterator
方法无法返回不可变、并发或后期绑定的分割迭代器时,应重写此方法。参考StreamSupport
类的stream
方法、Stream
接口。
default Stream<E> parallelStream() { return StreamSupport.stream(spliterator(), true); }
可能返回以此集合作为其源的并行流(指的是流输出元素顺序是随机的),允许返回序列流,类似stream
方法。default
关键字给出默认实现。
boolean contains(Object o);
判断集合是否包含对象o
。通常认为找到一个元素e
,存在Objects.equals(o, e)
则返回true
。参考Objects.equals
方法。
若对象o
的类型和集合类型不能比较,则抛出ClassCastException
异常(可选);若对象o
为空而集合不允许有空元素,则抛出NullPointerException
异常(可选)。
boolean containsAll(Collection<?> c);
判断此集合是否包含集合c
的所有元素。若都包含则返回true
。
若c
中某元素的类型和此集合类型不能比较,则抛出ClassCastException
异常(可选);若c
中某元素为空而此集合不允许有空元素(可选),或c
为空,则抛出NullPointerException
异常。
boolean add(E e);
添加元素e
到此集合中(可选)。若成功添加,返回true
;若集合规定不能有重复元素但e
为重复元素,则不添加,返回false
。
若实现类不支持add
操作,则抛出UnsupportedOperationException
异常;若因e
的类而不能加入集合中,则抛出ClassCastException
异常;若元素e
为空而集合不允许有空元素,则抛出NullPointerException
异常;若因e
的一些属性而不能加入集合中,则抛出IllegalArgumentException
异常;若因插入限制而不能加入集合中,则抛出IllegalStateException
异常。
boolean addAll(Collection<? extends E> c);
添加集合c
的所有元素到此集合中(可选)。若成功添加,返回true
。
若实现类不支持addAll
操作,则抛出UnsupportedOperationException
异常;若因c
中某元素的类而不能加入此集合中,则抛出ClassCastException
异常;若c
中某元素为空而此集合不允许有空元素,或c
为空,则抛出NullPointerException
异常;若因c
中某元素的一些属性而不能加入此集合中,则抛出IllegalArgumentException
异常;若因插入限制而不能加入此集合中,则抛出IllegalStateException
异常。
boolean remove(Object o);
从集合中移除一个等于对象o
的元素(可选)。通常认为找到一个元素e
,存在Objects.equals(o, e)
则移除。若成功移除,返回true
。
若对象o
的类型和集合类型不能比较,则抛出ClassCastException
异常(可选);若对象o
为空而集合不允许有空元素,则抛出NullPointerException
异常(可选);若实现类不支持remove
操作,则抛出UnsupportedOperationException
异常。
boolean removeAll(Collection<?> c);
从此集合中移除集合c
中的所有元素(有包含的话)(可选)。若成功移除,返回true
。
若c
中某对象的类型和此集合类型不能比较,则抛出ClassCastException
异常(可选);若c
中某对象为空而此集合不允许有空元素(可选),或c
为空,则抛出NullPointerException
异常;若实现类不支持removeAll
操作,则抛出UnsupportedOperationException
异常。
default boolean removeIf(Predicate<? super E> filter) { /*...*/ }
使用过滤器filter
过滤并移除所有符合条件的元素(使用迭代器遍历、移除),若有所移除,返回true
。default
关键字给出默认实现,使用Predicate
(断言)接口的boolean test(T t)
方法进行筛选,参考Predicate
接口。
若过滤器为空,则抛出NullPointerException
异常;若集合或元素不支持移除,或迭代器iterator()
不支持remove
操作,则抛出UnsupportedOperationException
异常。
boolean retainAll(Collection<?> c);
保留此集合中有包含在集合c
中的所有元素,即移除其它c
中没有的元素(可选)。若移除成功,返回true
。
若c
中某对象的类型和此集合类型不能比较,则抛出ClassCastException
异常(可选);若c
中某对象为空而此集合不允许有空元素(可选),或c
为空,则抛出NullPointerException
异常;若实现类不支持retainAll
操作,则抛出UnsupportedOperationException
异常。
void clear();
清空集合(可选)。若实现类不支持clear
操作,则抛出UnsupportedOperationException
异常。
Object[] toArray();
返回包含所有元素的对象数组。
<T> T[] toArray(T[] a);
传入泛型T
,为返回数组的元素的类型。返回包含所有元素的对象数组。若a
数组大小足够存储集合元素,那元素将存它里面(多余的空间第一个位置设空);否则将创建返回新的数组。
若集合元素运行时类型不能分配给数组运行时组件类型(参考Class.getComponentType
方法),则抛出ArrayStoreException
异常;若数组为空,则抛出NullPointerException
异常。
注意:若需要集合元素有序(迭代器遍历顺序),那返回数组也应该有相同的顺序。返回数组的运行时类型是a
的类型。toArray(new Object[0])
功能和toArray()
相同。
default <T> T[] toArray(IntFunction<T[]> generator) { return toArray(generator.apply(0)); }
传入泛型T
,为返回数组的元素的类型。使用生成器generator
分配数组空间,然后返回包含所有元素的数组。类似toArray(T[] a)
方法,但参数数组由generator
生成。default
关键字给出默认实现,它的逻辑相当于toArray(new T[0])
(比如generator
为T[]::new
时),但由于java不能new
泛型数组,则new
操作由实现IntFunction
接口的类按具体类型来执行。参考IntFunction
接口。
若集合元素运行时类型不能分配给生成数组运行时组件类型,则抛出ArrayStoreException
异常;若生成器为空,则抛出NullPointerException
异常。
注意:若需要集合元素有序(迭代器遍历顺序),那返回数组也应该有相同的顺序。返回数组的运行时类型是传入IntFunction
接口的数组元素类型。
新人源码理解,望大家多多指点。