框架概览
本系列文章所讨论的《JDK容器与并发》都是基于jdk 1.7.0_79版本。JDK中涉及的容器及Map框架图如下:
Collection(俗称容器)包括List、Set、Queue,Map用来存储key-value对。
类、接口说明
Collection
包含一组对象,每一个对象为其一个元素(当然这里实际包含的是指向对象的引用)。其接口如下:
public interface Collection<E> extends Iterable<E>
主要包括获取容器大小、是否为空、是否包含元素、获取迭代器、转化数组、增加、删除元素及相关批量操作,以及提供equals、hashCode接口出来。
AbstractCollection
AbstractCollection是Collection的一个简单基础版本的实现,一个抽象类:
public abstract Iterator<E> iterator();
public abstract int size();
public boolean add(E e) {
throw new UnsupportedOperationException();
}
对于unmodifiable的Collection实现只需要实现iterator()、size()就可以了;对于modifiable的Collection实现则另加实现add(E e)、iterator()返回的Iterator需要实现remove方法。其他方法基本上都是基于iterator()实现的。
List
List表示一组序列,提供基于索引的随机访问、随机插入、随机删除元素,提供ListIterator双向迭代器,如下:
AbstractList
AbstractList是对List接口的关于便于随机访问的简单基础实现,一个抽象类。对于unmodifiable的List实现,只需要实现get(int)、size()方法;对于modifiable的List实现,需要另加实现set(int, E),如果该List是size可变化的,还需实现add(int, E)、remove(int)。另外,AbstractList基于随机访问方法:get(int)、set(int, E)、add(int, E)、remove(int)实现了iterator、list iterator,也提供了SubList内部类。
AbstractSequentialList
AbstractSequentialList是对List接口的关于便于顺序访问的简单基础实现,一个抽象类。与AbstractList相反,AbstractSequentialList基于listIterator(int index)方法实现随机访问方法:get(int)、set(int, E)、add(int, E)、remove(int)。对于unmodifiable的List实现,只需要实现listIterator(int)、size()方法;对于modifiable的List实现,需要另加实现set(int, E),如果该List是size可变化的,还需实现add(int, E)、remove(int)。
Set
Set是对数学中集合的抽象,但其不会包含相等的元素(基于e1.equals(e2)),其无新增方法。
AbstractSet
AbstractSet是对Set接口的简单基础实现,一个抽象类。AbstractSet仅override了AbstractCollection的equals、hashCode、removeAll方法。其Set实现与AbstractCollection差不多,除了要求Set中不能有相同的元素外。
Queue
俗称队列,其设计目标是存储处理前的元素。在Collection基础上,新增了入队、出队、访问队首元素的方法:
1)Queue有两套功能相同的方法:add、remove、element分别为入队、出队、访问队首元素方法的抛出异常版本;offer、poll、peek则为返回特殊值的版本;
2)像offer在有界队列中常用,当队列已满时,元素入队会返回false而不是抛出异常,因为这一般当作正常情况;
3)按照元素出入队顺序可分为:FIFO队列、LIFO队列、优先级队列,这三种队列的一个共同点是:remove、poll返回的元素都是队首元素;
4)Queue一般不自行实现基于元素的equals、hashCode方法,因为在队列中可能存在多个相等的元素,但是它们的顺序是不同的,“顺序”在队列中是很特别的。
AbstractQueue
AbstractQueue是对Queue接口的简单基础实现,一个抽象类。提供add、remove、element分别基于offer、poll、peek实现,采用抛出异常代替相关的特殊值null或false返回。例如add的实现:
public boolean add(E e) {
if (offer(e))
return true;
else
throw new IllegalStateException("Queue full");
}
其Queue的实现需要实现offer(不能offer null)、poll、peek及Collection的size、iterator方法。
Map
Map用来存储key-value对,其中每个key在Map中是唯一的。其提供关于其内容的三种容器视图:Set<K>、Collection<V>、Set<Map.Entry<K, V>>,Map的key-value对顺序由视图迭代器顺序决定。
AbstractMap
AbstractMap是对Map接口的简单基础实现,一个抽象类。对于unmodifiable的List实现,只需要实现entrySet方法,该Set不应该支持add、remove方法以及其iterator不应该支持remove方法;对于modifiable的List实现,需要另加实现put,entrySet().iterator()返回的iterator需要实现remove方法。其他方法基本上都是基于entrySet实现的。