Collection接口源码理解

文章目录

  • 前言
  • 一、概述
  • 二、源码理解
    • 方法
      • size
      • isEmpty
      • equals
      • hashCode
      • iterator
      • spliterator
      • stream
      • parallelStream
      • contains
      • containsAll
      • add
      • addAll
      • remove
      • removeAll
      • removeIf
      • retainAll
      • clear
      • toArray
  • 总结


前言

本文章帮助大家对Collection接口的理解。


一、概述

Collection意为集合(无特殊说明,本文章“集合”指Collection)。顾名思义,就是同一类对象(元素)的集合体。无论是否有重复的元素,只要是需要使用符合集合体特性的,建议实现此接口。

二、源码理解

package java.util;
import java.util.Collection;

使用Collection接口时,需引入此包。

public interface Collection<E> extends Iterable<E> { /*...*/ }

使用接口时传入泛型E,为可迭代集合的元素的类型。继承了Iterable接口,使集合具有遍历元素的功能,重点为iterator方法。参考Iterable接口。

注意:要求其实现类遵守如此规定:需实现两个构造函数:一个无参数构造函数,以创建一个空集合;一个参数为Collection类型的构造函数,以创建一个具有和参数相同元素的集合。但由于接口不能包含构造函数,所以无法强制执行此规定。

但Java平台库中的所有通用集合实现都符合此约定。

方法

size

int size();

返回元素个数。若集合包含元素个数大于Integer.MAX_VALUE,则返回Integer.MAX_VALUE

isEmpty

boolean isEmpty();

判断集合是否为空。

equals

boolean equals(Object o);

重写Object类的boolean equals(Object obj)方法,参考Object.equals方法。

判断集合和对象o是否相同/相等。

注意:集合的不同实现的比较,应该返回false

hashCode

int hashCode();

重写Object类的int hashCode()方法,参考Object.hashCode方法。

返回此集合的哈希码。

iterator

Iterator<E> iterator();

重写Iterable接口的Iterator iterator()方法,参考Iterable.iterator方法。

重点:为使实现Collection接口的类对象可以遍历元素,需要实现类自定义迭代方法,即实现此方法以返回迭代器。而要使用自定义迭代器,需实现Iterator接口的hasNextnext方法。参考Iterator接口。

spliterator

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

重写IterableSpliterator spliterator()方法,参考Iterable.Spliterator方法。

返回覆盖此集合元素的分割迭代器,可用来遍历、分割序列。参考Spliterators.spliterator方法。default关键字给出默认实现。

stream

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

返回以此集合作为其源的序列流。default关键字给出默认实现。

注意:当spliterator方法无法返回不可变并发后期绑定的分割迭代器时,应重写此方法。参考StreamSupport类的stream方法、Stream接口。

parallelStream

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

可能返回以此集合作为其源的并行流(指的是流输出元素顺序是随机的),允许返回序列流,类似stream方法。default关键字给出默认实现。

contains

boolean contains(Object o);

判断集合是否包含对象o。通常认为找到一个元素e,存在Objects.equals(o, e)则返回true。参考Objects.equals方法。

若对象o的类型和集合类型不能比较,则抛出ClassCastException异常(可选);若对象o为空而集合不允许有空元素,则抛出NullPointerException异常(可选)。

containsAll

boolean containsAll(Collection<?> c);

判断此集合是否包含集合c的所有元素。若都包含则返回true

c中某元素的类型和此集合类型不能比较,则抛出ClassCastException异常(可选);若c中某元素为空而此集合不允许有空元素(可选),或c为空,则抛出NullPointerException异常。

add

boolean add(E e);

添加元素e到此集合中(可选)。若成功添加,返回true;若集合规定不能有重复元素但e为重复元素,则不添加,返回false

若实现类不支持add操作,则抛出UnsupportedOperationException异常;若因e的类而不能加入集合中,则抛出ClassCastException异常;若元素e为空而集合不允许有空元素,则抛出NullPointerException异常;若因e的一些属性而不能加入集合中,则抛出IllegalArgumentException异常;若因插入限制而不能加入集合中,则抛出IllegalStateException异常。

addAll

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

添加集合c的所有元素到此集合中(可选)。若成功添加,返回true

若实现类不支持addAll操作,则抛出UnsupportedOperationException异常;若因c中某元素的类而不能加入此集合中,则抛出ClassCastException异常;若c中某元素为空而此集合不允许有空元素,或c为空,则抛出NullPointerException异常;若因c中某元素的一些属性而不能加入此集合中,则抛出IllegalArgumentException异常;若因插入限制而不能加入此集合中,则抛出IllegalStateException异常。

remove

boolean remove(Object o);

从集合中移除一个等于对象o的元素(可选)。通常认为找到一个元素e,存在Objects.equals(o, e)则移除。若成功移除,返回true

若对象o的类型和集合类型不能比较,则抛出ClassCastException异常(可选);若对象o为空而集合不允许有空元素,则抛出NullPointerException异常(可选);若实现类不支持remove操作,则抛出UnsupportedOperationException异常。

removeAll

boolean removeAll(Collection<?> c);

从此集合中移除集合c中的所有元素(有包含的话)(可选)。若成功移除,返回true

c中某对象的类型和此集合类型不能比较,则抛出ClassCastException异常(可选);若c中某对象为空而此集合不允许有空元素(可选),或c为空,则抛出NullPointerException异常;若实现类不支持removeAll操作,则抛出UnsupportedOperationException异常。

removeIf

default boolean removeIf(Predicate<? super E> filter) { /*...*/ }

使用过滤器filter过滤并移除所有符合条件的元素(使用迭代器遍历、移除),若有所移除,返回truedefault关键字给出默认实现,使用Predicate(断言)接口的boolean test(T t)方法进行筛选,参考Predicate接口。

若过滤器为空,则抛出NullPointerException异常;若集合或元素不支持移除,或迭代器iterator()不支持remove操作,则抛出UnsupportedOperationException异常。

retainAll

boolean retainAll(Collection<?> c);

保留此集合中有包含在集合c中的所有元素,即移除其它c中没有的元素(可选)。若移除成功,返回true

c中某对象的类型和此集合类型不能比较,则抛出ClassCastException异常(可选);若c中某对象为空而此集合不允许有空元素(可选),或c为空,则抛出NullPointerException异常;若实现类不支持retainAll操作,则抛出UnsupportedOperationException异常。

clear

void clear();

清空集合(可选)。若实现类不支持clear操作,则抛出UnsupportedOperationException异常。

toArray

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])(比如generatorT[]::new时),但由于java不能new泛型数组,则new操作由实现IntFunction接口的类按具体类型来执行。参考IntFunction接口。

若集合元素运行时类型不能分配给生成数组运行时组件类型,则抛出ArrayStoreException异常;若生成器为空,则抛出NullPointerException异常。

注意:若需要集合元素有序(迭代器遍历顺序),那返回数组也应该有相同的顺序。返回数组的运行时类型是传入IntFunction接口的数组元素类型。


总结

新人源码理解,望大家多多指点。

你可能感兴趣的:(java,#,jdk14,#,jdk18,java)