本文章帮助大家对AbstractCollection
类的理解。
AbstractCollection
意为集合(无特殊说明,本文章“集合”指AbstractCollection
)。顾名思义,Collection
集合的抽象实现类。参考Collection
接口。
package java.util;
import java.util.AbstractCollection;
使用AbstractCollection
类时,需引入此包。
public abstract class AbstractCollection<E> implements Collection<E> { /*...*/ }
使用类时传入泛型E
,为集合元素的类型。继承了Collection
接口,使其具有Collection
的表现。
其提供Collection
的框架实现,尽可能减少其他类实现Collection
所需的工作量。
protected AbstractCollection() {}
受保护构造函数,不做处理。
public abstract int size();
重写Collection
接口的int size()
方法,参考Collection.size
方法。
抽象方法。返回元素个数。
public boolean isEmpty() { return size() == 0; }
重写Collection
接口的boolean isEmpty()
方法,参考Collection.isEmpty
方法。
判断集合是否为空。size
方法返回值是否为0。
public String toString() { /*...*/ }
重写Object
类的String toString()
方法,参考Object.toString
方法。
将此集合“转换”为字符串,由中括号“[]”包裹,逗号加空格“, ”分隔元素,若元素是此集合本身,则用“(this Collection)”表示。使用迭代器遍历元素,将元素“转换”为字符串后拼接。
public abstract Iterator<E> iterator();
重点:重写Collection
接口的Iterator
方法,参考Collection.iterator
方法。
抽象方法。返回遍历元素的迭代器。
public boolean contains(Object o) { /*...*/ }
重写Collection
接口的boolean contains(Object o)
方法,参考Collection.contains
方法。
判断集合是否包含对象o
。通常认为找到一个元素e
,存在Objects.equals(o, e)
则返回true
。参考Objects.equals
方法。使用迭代器遍历元素,与o
作比较。
public boolean containsAll(Collection<?> c) { /*...*/ }
重写Collection
接口的boolean containsAll(Collection> c)
方法,参考Collection.containsAll
方法。
判断此集合是否包含集合c
的所有元素。若都包含则返回true
。遍历c
的所有元素,逐个用contains
方法判断是否在此集合中。
public boolean add(E e) { throw new UnsupportedOperationException(); }
重写Collection
接口的boolean add(E e)
方法,参考Collection.add
方法。
添加元素e
到此集合中(可选)。若成功添加,返回true
;若集合规定不能有重复元素但e
为重复元素,则不添加,返回false
。不支持add
方法,调用它将抛出UnsupportedOperationException
异常。
public boolean addAll(Collection<? extends E> c) { /*...*/ }
重写Collection
接口的boolean addAll(Collection extends E> c)
方法,参考Collection.addAll
方法。
添加集合c
的所有元素到此集合中(可选)。若成功添加,返回true
。遍历c
的所有元素,逐个用add
方法添加到此集合中。
注意:若不支持add
操作,则抛出UnsupportedOperationException
异常。
public boolean remove(Object o) { /*...*/ }
重写Collection
接口的boolean remove(Object o)
方法,参考Collection.remove
方法。
从集合中移除一个等于对象o
的元素(可选)。通常认为找到一个元素e
,存在Objects.equals(o, e)
则移除。若成功移除,返回true
。
注意:使用迭代器遍历、判断、删除。若迭代器不支持remove
操作,则抛出UnsupportedOperationException
异常。
public boolean removeAll(Collection<?> c) { /*...*/ }
重写Collection
接口的boolean removeAll(Collection> c)
方法,参考Collection.removeAll
方法。
从此集合中移除集合c
中的所有元素(有包含的话)(可选)。若成功移除,返回true
。使用迭代器遍历此集合所有元素,若有包含在c
中则移除。
注意:使用迭代器遍历、判断、删除。若迭代器不支持remove
操作,则抛出UnsupportedOperationException
异常。
public boolean retainAll(Collection<?> c) { /*...*/ }
重写Collection
接口的boolean retainAll(Collection> c)
方法,参考Collection.retainAll
方法。
保留此集合中有包含在集合c
中的所有元素,即移除其它c
中没有的元素(可选)。若移除成功,返回true
。使用迭代器遍历此集合所有元素,若不包含在c
中则移除。
注意:使用迭代器遍历、判断、删除。若迭代器不支持remove
操作,则抛出UnsupportedOperationException
异常。
public void clear() { /*...*/ }
重写Collection
接口的void clear()
方法,参考Collection.clear
方法。
清空集合(可选)。使用迭代器遍历此集合所有元素并移除。
注意:使用迭代器遍历、判断、删除。若迭代器不支持remove
操作,则抛出UnsupportedOperationException
异常。
private static <T> T[] finishToArray(T[] r, Iterator<?> it) { /*...*/ }
传入泛型T
,为返回数组的元素的类型。返回包含r
数组元素拼接迭代器it
覆盖的元素的对象数组。若it
无覆盖元素,则返回r
;否则将创建返回新的数组。
public Object[] toArray() { /*...*/ }
重写Collection
接口的Object[] toArray()
方法,参考Collection.toArray
方法。
返回包含所有元素的对象数组。使用到finishToArray
方法。
重点:数组为新分配的空间,大小为迭代器覆盖的元素数,不一定等于size
方法返回值(因为集合可能会被并发修改,size
方法只能作为参考),元素顺序同迭代器遍历顺序。
public <T> T[] toArray(T[] a) { /*...*/ }
重写Collection
接口的
方法,参考Collection.toArray
方法。
传入泛型T
,为返回数组的元素的类型。返回包含所有元素的对象数组。若a
数组大小足够存储列表元素,那元素将存它里面(多余的空间第一个位置设空);否则将创建返回新的数组。使用到finishToArray
方法。
重点:前部分元素顺序同迭代器遍历顺序。
新人源码理解,望大家多多指点。