一、Java容器绪论
Java容器主要包括两类,对应的根接口分别为Map和Collection。Collection又主要包括3类,对应的根接口分别为List,Queue和Set。
Map、List、Queue和Set又都有“并发”和“非并发(普通)”之分。在并发容器中,如果简单粗暴使用synchronized实现操作的线程安全,该并发容器又可被称为“同步容器”。
故Java容器划分示意图如图1。
图1
二、一些说明
2.1、Collection接口的迭代器
Collection接口继承Iterable接口,因此其有Iterator<E> iterator()方法生成迭代器。
迭代器的主要方法如下:
- boolean hasNext():是否存在下一个待遍历元素
- E next():下一个待遍历元素
- void remove():删除最近一个已遍历元素
假设Collection实例为A,其生成的迭代器实例为B,一段时间内同时使用A和B进行操作(逻辑同时,指“使用A后再使用B”或者“使用B后再使用A”,故可以是多线程的,也可以是单线程的),根据“在A上修改后B的表现”和“在B上修改后A的表现”可将迭代器分为4类:快速失败、快照式、弱一致性和其他。
具体描述如下表。
| 迭代器类型 | 描述 | 在A上修改后B的表现 | 在B上修改(迭代器的修改操作只有 remove())后A的表现 | 
|---|---|---|---|
| 快速失败 | fail-fast | 抛出 ConcurrentModificationException异常 | 具体实现具体定义。比如“ArrayList对应迭代器的 remove()方法实现是转发调用外围ArrayList实例的remove(int index)方法” | 
| 快照式 | snapshot,在创建生成迭代器时,复制一份内容,故后续两边的操作互相独立 | 不抛出异常,通过B不能感知A上修改 | 通过A不能感知B上修改 | 
| 弱一致性 | weakly consistent | 不抛出异常,通过B不一定能够感知A上的修改,即便能够感知,也不一定是准确一致的,比如“有ArrayBlockingQueue实例A,其对应的迭代器实例为B,调用B的 hasNext()方法返回true,后续再调用B的next()方法必返回一个元素,如果此时通过A已经删除该元素,则产生不一致” | 通过A不一定能够感知B上的修改,即便能够感知,也不一定是准确一致的 | 
| 其他 | undefined | 未定义 | 未定义 | 
参考文献
[1]https://zhuanlan.zhihu.com/p/300162795
[2]https://blog.csdn.net/yuanlaijike/article/details/108177720
