【转载】Java 集合系列02之 Collection架构
概要
首先,我们对Collection进行说明。下面先看看Collection的一些框架类的关系图:
Collection是一个接口,它主要的两个分支是:List 和 Set。
List和Set都是接口,它们继承于Collection。List是有序的队列,List中可以有重复的元素;而Set是数学概念中的集合,Set中没有重复元素!
List和Set都有它们各自的实现类。
为了方便,我们抽象出了AbstractCollection抽象类,它实现了Collection中的绝大部分函数;这样,在Collection的实现类中,我们就可以通过继承AbstractCollection省去重复编码。AbstractList和AbstractSet都继承于AbstractCollection,具体的List实现类继承于AbstractList,而Set的实现类则继承于AbstractSet。
另外,Collection中有一个iterator()函数,它的作用是返回一个Iterator接口。通常,我们通过Iterator迭代器来遍历集合。ListIterator是List接口所特有的,在List接口中,通过ListIterator()返回一个ListIterator对象。
接下来,我们看看各个接口和抽象类的介绍;然后,再对实现类进行详细的了解。
1 Collection简介
Collection的定义如下:
public interface Collection<E> extends Iterable<E> {}
它是一个接口,是高度抽象出来的集合,它包含了集合的基本操作:添加、删除、清空、遍历(读取)、是否为空、获取大小、是否保护某元素等等。
Collection接口的所有子类(直接子类和间接子类)都必须实现2种构造函数:不带参数的构造函数 和 参数为Collection的构造函数。带参数的构造函数,可以用来转换Collection的类型。
// collection api
boolean add(E e) //确保此 collection 包含指定的元素(可选操作)。支持此操作的 collection 可以限制哪些元素能添加到此 collection 中来。 boolean addAll(Collection<? extends E> c) //将指定 collection 中的所有元素都添加到此 collection 中(可选操作)。 void clear() //移除此 collection 中的所有元素(可选操作)。 boolean contains(Object o) //如果此 collection 包含指定的元素,则返回 true。 boolean containsAll(Collection<?> c) //如果此 collection 包含指定 collection 中的所有元素,则返回 true。 boolean equals(Object o) //比较此 collection 与指定对象是否相等。 int hashCode() //返回此 collection 的哈希码值。 boolean isEmpty() //如果此 collection 不包含元素,则返回 true。 Iterator<E> iterator() //返回在此 collection 的元素上进行迭代的迭代器。 boolean remove(Object o) //从此 collection 中移除指定元素的单个实例,如果存在的话(可选操作)。 boolean removeAll(Collection<?> c) //移除此 collection 中那些也包含在指定 collection 中的所有元素(可选操作)。 boolean retainAll(Collection<?> c) //仅保留此 collection 中那些也包含在指定 collection 的元素(可选操作)。 int size() //返回此 collection 中的元素数。 Object[] toArray() //返回包含此 collection 中所有元素的数组。 <T> T[] toArray(T[] a) //返回包含此 collection 中所有元素的数组;返回数组的运行时类型与指定数组的运行时类型相同。
2 List简介
List的定义如下:
public interface List<E> extends Collection<E> {}
List是一个继承于Collection的接口,即List是集合中的一种。List是有序的队列,List中的每一个元素都有一个索引;第一个元素的索引值是0,往后的元素的索引值依次+1。和Set不同,List中允许有重复的元素。
List的官方介绍如下:
A List is a collection which maintains an ordering for its elements. Every element in the List has an index. Each element can thus be accessed by its index, with the first index being zero. Normally, Lists allow duplicate elements, as compared to Sets, where elements have to be unique.
关于API方面。既然List是继承于Collection接口,它自然就包含了Collection中的全部函数接口;由于List是有序队列,它也额外的有自己的API接口。主要有“添加、删除、获取、修改指定位置的元素”、“获取List中的子队列”等。
//List API 表示相比与Collection,List新增的API
boolean add(E e) //向列表的尾部添加指定的元素(可选操作)。 void add(int index, E element) //在列表的指定位置插入指定元素(可选操作)。 boolean addAll(Collection<? extends E> c) //添加指定 collection 中的所有元素到此列表的结尾,顺序是指定 collection 的迭代器返回这些元素的顺序(可选操作)。 boolean addAll(int index, Collection<? extends E> c) //将指定 collection 中的所有元素都插入到列表中的指定位置(可选操作)。 void clear() //从列表中移除所有元素(可选操作)。 boolean contains(Object o) //如果列表包含指定的元素,则返回 true。 boolean containsAll(Collection<?> c) //如果列表包含指定 collection 的所有元素,则返回 true。 boolean equals(Object o) //比较指定的对象与列表是否相等。 E get(int index) //返回列表中指定位置的元素。 int hashCode() //返回列表的哈希码值。 int lastIndexOf(Object o) //返回此列表中最后出现的指定元素的索引;如果列表不包含此元素,则返回 -1。 int indexOf(Object o) //返回此列表中第一次出现的指定元素的索引;如果此列表不包含该元素,则返回 -1。 boolean isEmpty() //如果列表不包含元素,则返回 true。 Iterator<E> iterator() //返回按适当顺序在列表的元素上进行迭代的迭代器。 ListIterator<E> listIterator() //返回此列表元素的列表迭代器(按适当顺序)。 ListIterator<E> listIterator(int index) //返回列表中元素的列表迭代器(按适当顺序),从列表的指定位置开始。 E remove(int index) //移除列表中指定位置的元素(可选操作)。 boolean remove(Object o) //从此列表中移除第一次出现的指定元素(如果存在)(可选操作)。 boolean removeAll(Collection<?> c) //从列表中移除指定 collection 中包含的其所有元素(可选操作)。 boolean retainAll(Collection<?> c) //仅在列表中保留指定 collection 中所包含的元素(可选操作)。 E set(int index, E element) //用指定元素替换列表中指定位置的元素(可选操作)。 int size() //返回列表中的元素数。 List<E> subList(int fromIndex, int toIndex) //返回列表中指定的 fromIndex(包括 )和 toIndex(不包括)之间的部分视图。 Object[] toArray() //返回按适当顺序包含列表中的所有元素的数组(从第一个元素到最后一个元素)。 <T> T[] toArray(T[] a) //返回按适当顺序(从第一个元素到最后一个元素)包含列表中所有元素的数组;返回数组的运行时类型是指定数组的运行时类型。
3 Set简介
Set的定义如下:
public interface Set<E> extends Collection<E> {}
Set是一个继承于Collection的接口,即Set也是集合中的一种。Set是没有重复元素的集合。
关于API方面。Set的API和Collection完全一样。
// Set的API(同Collection)
boolean add(E e) //如果 set 中尚未存在指定的元素,则添加此元素(可选操作)。 boolean addAll(Collection<? extends E> c) //如果 set 中没有指定 collection 中的所有元素,则将其添加到此 set 中(可选操作)。 void clear() //移除此 set 中的所有元素(可选操作)。 boolean contains(Object o) //如果 set 包含指定的元素,则返回 true。 boolean containsAll(Collection<?> c) //如果此 set 包含指定 collection 的所有元素,则返回 true。 boolean equals(Object o) //比较指定对象与此 set 的相等性。 int hashCode() //返回 set 的哈希码值。 boolean isEmpty() //如果 set 不包含元素,则返回 true。 Iterator<E> iterator() //返回在此 set 中的元素上进行迭代的迭代器。 boolean remove(Object o) //如果 set 中存在指定的元素,则将其移除(可选操作)。 boolean removeAll(Collection<?> c) //移除 set 中那些包含在指定 collection 中的元素(可选操作)。 boolean retainAll(Collection<?> c) //仅保留 set 中那些包含在指定 collection 中的元素(可选操作)。 int size() //返回 set 中的元素数(其容量)。 Object[] toArray() //返回一个包含 set 中所有元素的数组。 <T> T[] toArray(T[] a) //返回一个包含此 set 中所有元素的数组;返回数组的运行时类型是指定数组的类型。
4 AbstractCollection
AbstractCollection的定义如下:
public abstract class AbstractCollection<E> implements Collection<E> {}
AbstractCollection是一个抽象类,它实现了Collection中除iterator()和size()之外的函数。
AbstractCollection的主要作用:它实现了Collection接口中的大部分函数。从而方便其它类实现Collection,比如ArrayList、LinkedList等,它们这些类想要实现Collection接口,通过继承AbstractCollection就已经实现了大部分的接口了。
5 AbstractList
AbstractList的定义如下:
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {}
AbstractList是一个继承于AbstractCollection,并且实现List接口的抽象类。它实现了List中除size()、get(int location)之外的函数。
AbstractList的主要作用:它实现了List接口中的大部分函数。从而方便其它类继承List。
另外,和AbstractCollection相比,AbstractList抽象类中,实现了iterator()接口。
6 AbstractSet
AbstractSet的定义如下:
public abstract class AbstractSet<E> extends AbstractCollection<E> implements Set<E> {}
AbstractSet是一个继承于AbstractCollection,并且实现Set接口的抽象类。由于Set接口和Collection接口中的API完全一样,Set也就没有自己单独的API。和AbstractCollection一样,它实现了List中除iterator()和size()之外的函数。
AbstractSet的主要作用:它实现了Set接口中的大部分函数。从而方便其它类实现Set接口。
7 Iterator
Iterator的定义如下:
public interface Iterator<E> {}
Iterator是一个接口,它是集合的迭代器。集合可以通过Iterator去遍历集合中的元素。Iterator提供的API接口,包括:是否存在下一个元素、获取下一个元素、删除当前元素。
注意:Iterator遍历Collection时,是fail-fast机制的。即,当某一个线程A通过iterator去遍历某集合的过程中,若该集合的内容被其他线程所改变了;那么线程A访问集合时,就会抛出ConcurrentModificationException异常,产生fail-fast事件。
// Iterator的API
boolean hasNext() //如果仍有元素可以迭代,则返回 true。 E next() //返回迭代的下一个元素。 void remove() //从迭代器指向的 collection 中移除迭代器返回的最后一个元素(可选操作)。
8 ListIterator
ListIterator的定义如下:
public interface ListIterator<E> extends Iterator<E> {}
ListIterator是一个继承于Iterator的接口,它是队列迭代器。专门用于便利List,能提供向前/向后遍历。相比于Iterator,它新增了添加、是否存在上一个元素、获取上一个元素等等API接口。
//ListIterator API 红色部分是在Iterator基础上新增的
void add(E e) //将指定的元素插入列表(可选操作)。 boolean hasNext() //以正向遍历列表时,如果列表迭代器有多个元素,则返回 true(换句话说,如果 next 返回一个元素而不是抛出异常,则返回 true)。 boolean hasPrevious() //如果以逆向遍历列表,列表迭代器有多个元素,则返回 true。 E next() //返回列表中的下一个元素。 int nextIndex() //返回对 next 的后续调用所返回元素的索引。 E previous() //返回列表中的前一个元素。 int previousIndex() //返回对 previous 的后续调用所返回元素的索引。 void remove() //从列表中移除由 next 或 previous 返回的最后一个元素(可选操作)。 void set(E e) //用指定元素替换 next 或 previous 返回的最后一个元素(可选操作)。