JDK容器与并发—JDK容器框架

框架概览

      本系列文章所讨论的《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实现的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值