多线程_JUC集合

img

[TOC]

JUC集合

List的实现类主要有: LinkedList, ArrayList, Vector, Stack。

(01) LinkedList是双向链表实现的双端队列;它不是线程安全的,只适用于单线程。 (02) ArrayList是数组实现的队列,它是一个动态数组;它也不是线程安全的,只适用于单线程。 (03) Vector是数组实现的矢量队列,它也一个动态数组;不过和ArrayList不同的是,Vector是线程安全的,它支持并发。 (04) Stack是Vector实现的栈;和Vector一样,它也是线程安全的。

Set的实现类主要有: HastSet和TreeSet。

(01) HashSet是一个没有重复元素的集合,它通过HashMap实现的;HashSet不是线程安全的,只适用于单线程。 (02) TreeSet也是一个没有重复元素的集合,不过和HashSet不同的是,TreeSet中的元素是有序的;它是通过TreeMap实现的;TreeSet也不是线程安全的,只适用于单线程。

Map的实现类主要有: HashMap,WeakHashMap, Hashtable和TreeMap。

(01) HashMap是存储“键-值对”的哈希表;它不是线程安全的,只适用于单线程。 (02) WeakHashMap是也是哈希表;和HashMap不同的是,HashMap的“键”是强引用类型,而WeakHashMap的“键”是弱引用类型,也就是说当WeakHashMap 中的某个键不再正常使用时,会被从WeakHashMap中被自动移除。WeakHashMap也不是线程安全的,只适用于单线程。 (03) Hashtable也是哈希表;和HashMap不同的是,Hashtable是线程安全的,支持并发。 (04) TreeMap也是哈希表,不过TreeMap中的“键-值对”是有序的,它是通过R-B Tree(红黑树)实现的;TreeMap不是线程安全的,只适用于单线程。 更多关于这些集合类的介绍,可以参考“Java 集合系列目录(Category)”。

CopyOnWriteArrayList

CopyOnWriteArrayList示例

ConcurrentSkipListMap

ConcurrentSkipListMap的数据结构

说明

先以数据“7,14,21,32,37,71,85”序列为例,来对跳表进行简单说明。

跳表分为许多层(level),每一层都可以看作是数据的索引,这些索引的意义就是加快跳表查找数据速度。每一层的数据都是有序的,上一层数据是下一层数据的子集,并且第一层(level 1)包含了全部的数据;层次越高,跳跃性越大,包含的数据越少。 跳表包含一个表头,它查找数据时,是从上往下,从左往右进行查找。现在“需要找出值为32的节点”为例,来对比说明跳表和普遍的链表。

情况1:链表中查找“32”节点

链表中查找“32”节点

情况2:跳表中查找“32”节点

跳表中查找“32”节点

忽略索引垂直线路上路径的情况下,只需要2步(红色部分表示路径)。

ConcurrentSkipListMap示例

Last updated

Was this helpful?