java集合框架02——Collection架构与源码分析

Collection是一个接口,它主要的两个分支是List和Set。如下图所示:

        List和Set都是接口,它们继承与Collection。List是有序的队列,可以用重复的元素;而Set是数学概念中的集合,不能有重复的元素。List和Set都有它们各自的实现类。

为了方便,我们抽象出AbstractCollection类来让其他类继承,该类实现类Collection中的绝大部分方法。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是一个接口。它是一个高度抽象出来的集合,包含了集合的基本操作:添加、删除、清空、遍历、是否为空、获取大小等。

        Collection接口的所有子类(直接子类和简介子类)都必须实现2种构造函数:不带参数的构造函数和参数为Collection的构造函数。带参数的构造函数可以用来转换Collection的类型。下面是Collection接口中定义的API:

// Collection的API  
abstract boolean         add(E object)  
abstract boolean         addAll(Collection<? extends E> collection)  
abstract void            clear()  
abstract boolean         contains(Object object)  
abstract boolean         containsAll(Collection<?> collection)  
abstract boolean         equals(Object object)  
abstract int             hashCode()  
abstract boolean         isEmpty()  
abstract Iterator<E>     iterator()  
abstract boolean         remove(Object object)  
abstract boolean         removeAll(Collection<?> collection)  
abstract boolean         retainAll(Collection<?> collection)  
abstract int             size()  
abstract <T> T[]         toArray(T[] array)  
abstract Object[]        toArray()
 

2. List

        List的定义如下:

public interface List<E> extends Collection<E> {}

从List定义中可以看出,它继承与Collection接口,即List是集合的一种。List是有序的队列,List中的每一个元素都有一个索引,第一个元素的索引值为0,往后的元素的索引值依次+1.,List中允许有重复的元素。

        List继承Collection自然包含了Collection的所有接口,由于List是有序队列,所以它也有自己额外的API接口。API如下:

 

// Collection的API  
abstract boolean         add(E object)  
abstract boolean         addAll(Collection<? extends E> collection)  
abstract void            clear()  
abstract boolean         contains(Object object)  
abstract boolean         containsAll(Collection<?> collection)  
abstract boolean         equals(Object object)  
abstract int             hashCode()  
abstract boolean         isEmpty()  
abstract Iterator<E>     iterator()  
abstract boolean         remove(Object object)  
abstract boolean         removeAll(Collection<?> collection)  
abstract boolean         retainAll(Collection<?> collection)  
abstract int             size()  
abstract <T> T[]         toArray(T[] array)  
abstract Object[]        toArray()  
// 相比与Collection,List新增的API:  
abstract void                add(int location, E object) //在指定位置添加元素  
abstract boolean             addAll(int location, Collection<? extends E> collection) //在指定位置添加其他集合中的元素  
abstract E                   get(int location) //获取指定位置的元素  
abstract int                 indexOf(Object object) //获得指定元素的索引  
abstract int                 lastIndexOf(Object object) //从右边的索引  
abstract ListIterator<E>     listIterator(int location) //获得iterator  
abstract ListIterator<E>     listIterator()  
abstract E                   remove(int location) //删除指定位置的元素  
abstract E                   set(int location, E object) //修改指定位置的元素  
abstract List<E>             subList(int start, int end) //获取子list  

 

3. Set

        Set的定义如下:


 

Set也继承与Collection接口,且里面不能有重复元素。关于API,Set与Collection的API完全一样,不在赘述。

4. AbstractCollection

public interface Set<E> extends Collection<E> {}

 AbstractCollection是一个抽象类,它实现了Collection中除了iterator()和size()之外的所有方法。AbstractCollection的主要作用是方便其他类实现Collection.,比如ArrayList、LinkedList等。它们想要实现Collection接口,通过集成AbstractCollection就已经实现大部分方法了,再实现一下iterator()和size()即可。

        下面看一下AbstractCollection实现的部分方法的源码:

复制代码


 

复制代码

5. AbstractList

        AbstractList的定义如下:


 

     从定义中可以看出,AbstractList是一个继承AbstractCollection,并且实现了List接口的抽象类。它实现了List中除了size()、get(int location)之外的方法。

        AbstractList的主要作用:它实现了List接口中的大部分函数,从而方便其它类继承List。另外,和AbstractCollection相比,AbstractList抽象类中,实现了iterator()方法。

        AbstractList抽象类的源码如下:

6. AbstractSet

        AbstractSet的定义如下:


 

 AbstractSet是一个继承与AbstractCollection,并且实现了Set接口的抽象类。由于Set接口和Collection接口中的API完全一样,所以Set也就没有自己单独的API。和AbstractCollection一样,它实现了List中除iterator()和size()外的方法。所以源码和AbstractCollection的一样。

 AbstractSet的主要作用:它实现了Set接口总的大部分函数,从而方便其他类实现Set接口。

7. Iterator

Iterator的定义如下:

 


 

 

  Iterator是一个接口,它是集合的迭代器。集合可以通过Iterator去遍历其中的元素。Iterator提供的API接口包括:是否存在下一个元素,获取下一个元素和删除当前元素。

        注意:Iterator遍历Collection时,是fail-fast机制的。即,当某一个线程A通过iterator去遍历某集合的过程中,若该集合的内容被其他线程所改变了,那么线程A访问集合时,就会抛出CurrentModificationException异常,产生fail-fast事件。下面是Iterator的几个API。


 

8. ListIterator

 ListIterator的定义如下:

 


 

 

ListIterator是一个继承Iterator的接口,它是队列迭代器。专门用于遍历List,能提供向前和向后遍历。相比于Iterator,它新增了添加、是否存在上一个元素、获取上一个元素等API接口:

复制代码


 

复制代码

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章