0%

Java容器

一、Java容器绪论

Java容器主要包括两类,对应的根接口分别为MapCollection
Collection又主要包括3类,对应的根接口分别为ListQueueSet

MapListQueueSet又都有“并发”和“非并发(普通)”之分。在并发容器中,如果简单粗暴使用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

您的支持将鼓励我继续分享!