Java 集合系列-第二篇-Collection架构

概要

首先,咱们对Collection进行说明。下面先看看Collection的一些框架类的关系图:架构

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。code

  • Collection中有一个iterator()函数,它的做用是返回一个Iterator接口。一般,咱们经过Iterator迭代器来遍历集合。ListIterator是List接口所特有的,在List接口中,经过ListIterator()返回一个ListIterator对象。对象

Collection简介

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

它是一个接口,是高度抽象出来的集合,它包含了集合的基本操做:添加、删除、清空、遍历(读取)、是否为空、获取大小、是否保护某元素等等。blog

Collection接口的全部子类(直接子类和间接子类)都必须实现2种构造函数:不带参数的构造函数 和 参数为Collection的构造函数。带参数的构造函数,能够用来转换Collection的类型。继承

// 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()

List简介

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

List是一个继承于Collection的接口,即List是集合中的一种。List是有序的队列,List中的每个元素都有一个索引;第一个元素的索引值是0,日后的元素的索引值依次+1。和Set不一样,List中容许有重复的元素。索引

关于API方面。既然List是继承于Collection接口,它天然就包含了Collection中的所有函数接口;因为List是有序队列,它也额外的有本身的API接口。主要有“添加、删除、获取、修改指定位置的元素”、“获取List中的子队列”等。

// 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)
abstract ListIterator<E>     listIterator()
abstract E                   remove(int location)
abstract E                   set(int location, E object)
abstract List<E>             subList(int start, int end)

Set简介

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

Set是一个继承于Collection的接口,即Set也是集合中的一种。Set是没有重复元素的集合。

关于API方面。Set的API和Collection彻底同样。

AbstractCollection

public abstract class AbstractCollection<E> implements Collection<E> {}

AbstractCollection是一个抽象类,它实现了Collection中除iterator()和size()以外的函数。 AbstractCollection的主要做用:它实现了Collection接口中的大部分函数。从而方便其它类实现Collection,好比ArrayList、LinkedList等,它们这些类想要实现Collection接口,经过继承AbstractCollection就已经实现了大部分的接口了。

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()接口。

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接口。

Iterator

Iterator是一个接口,它是集合的迭代器。集合能够经过Iterator去遍历集合中的元素。Iterator提供的API接口,包括:是否存在下一个元素、获取下一个元素、删除当前元素。 注意:Iterator遍历Collection时,是fail-fast机制的。即,当某一个线程A经过iterator去遍历某集合的过程当中,若该集合的内容被其余线程所改变了;那么线程A访问集合时,就会抛出ConcurrentModificationException异常,产生fail-fast事件。关于fail-fast的详细内容,咱们会在后面专门进行说明。TODO

// Iterator的API
abstract boolean hasNext()
abstract E next()
abstract void remove()

ListIterator

public interface ListIterator<E> extends Iterator<E> {}

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

// ListIterator的API
// 继承于Iterator的接口
abstract boolean hasNext()
abstract E next()
abstract void remove()
// 新增API接口
abstract void add(E object)
abstract boolean hasPrevious()
abstract int nextIndex()
abstract E previous()
abstract int previousIndex()
abstract void set(E object)
相关文章
相关标签/搜索