一、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