24-JUC中常见的集合

集合图

在这里插入图片描述

主体内容包括Collection集合和Map类;而Collection集合又可以划分为List(队列)和Set(集合)。

List的实现类

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

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

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

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

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

  • HashMap是存储“键-值对”的哈希表;它不是线程安全的,只适用于单线程。
  • WeakHashMap是也是哈希表;和HashMap不同的是,HashMap的“键”是强引用类型,而WeakHashMap的“键”是弱引用类型,也就是说当WeakHashMap 中的某个键不再正常使用时,会被从WeakHashMap中被自动移除,WeakHashMap也不是线程安全的,只适用于单线程。
  • Hashtable也是哈希表;和HashMap不同的是,Hashtable是线程安全的,支持并发。
  • TreeMap也是哈希表,不过TreeMap中的“键-值对”是有序的,它是通过R-B Tree(红黑树)实现的;TreeMap不是线程安全的,只适用于单线程。

JUC集合包中的List和Set

JUC集合包中的List和Set实现类包括: CopyOnWriteArrayList, CopyOnWriteArraySet和ConcurrentSkipListSet

  • CopyOnWriteArrayList相当于线程安全的ArrayList,它实现了List接口。CopyOnWriteArrayList是支持高并发的
  • CopyOnWriteArraySet相当于线程安全的HashSet,它继承于AbstractSet类。CopyOnWriteArraySet 内部包含一个CopyOnWriteArrayList对象(聚合关系),它是通过CopyOnWriteArrayList实现的
  • ConcurrentSkipListSet是线程安全的有序的集合(相当于线程安全的TreeSet);它继承于AbstractSet,并实现了NavigableSet接口。ConcurrentSkipListSet是通过ConcurrentSkipListMap实现的,它也支持并发。

JUC集合包中Map

JUC集合包中Map的实现类包括: ConcurrentHashMap和ConcurrentSkipListMap

  • ConcurrentHashMap是线程安全的哈希表(相当于线程安全的HashMap);它继承于AbstractMap类,并且实现ConcurrentMap接口。ConcurrentHashMap是通过“锁分段”来实现的,它支持并发
  • ConcurrentSkipListMap是线程安全的有序的哈希表(相当于线程安全的TreeMap); 它继承于AbstractMap类,并且实现ConcurrentNavigableMap接口。ConcurrentSkipListMap是通过“跳表”来实现的,它支持并发。

JUC包中Queue

  • ArrayBlockingQueue是数组实现的线程安全的有界的阻塞队列。
  • LinkedBlockingQueue是单向链表实现的(指定大小)阻塞队列,该队列按 FIFO(先进先出)排序元素。
  • LinkedBlockingDeque是双向链表实现的(指定大小)双向并发阻塞队列,该阻塞队列同时支持FIFO(先进先出)和FILO(先进后出)两种操作方式。
  • ConcurrentLinkedQueue是单向链表实现的无界队列,该队列按 FIFO(先进先出)排序元素。
  • ConcurrentLinkedDeque是双向链表实现的无界队列,该队列同时支持FIFO(先进先出)和FILO(先进后出)两种操作方式。

ConcurrentHashMap

功能和HashMap基本一致,内部使用红黑树实现的。
特性:

  • 迭代结果和存入顺序不一致
  • key和value都不能为空
  • 线程安全的

ConcurrentSkipListMap

内部使用跳表实现的,放入的元素会进行排序,排序算法支持2种方式来指定:

  1. 通过构造方法传入一个Comparator
  2. 放入的元素实现Comparable接口

上面2种方式必选一个,如果2种都有,走规则1。

特性:

  • 迭代结果和存入顺序不一致
  • 放入的元素会排序
  • key和value都不能为空
  • 线程安全的

CopyOnWriteArrayList

实现List的接口的,一般我们使用ArrayList、LinkedList、Vector,其中只有Vector是线程安全的,可以使用Collections静态类的synchronizedList方法对ArrayList、LinkedList包装为线程安全的List,不过这些方式在保证线程安全的情况下性能都不高。

CopyOnWriteArrayList是线程安全的List,内部使用数组存储数据,集合中多线程并行操作一般存在4种情况:读读、读写、写写、写读,这个只有在写写操作过程中会导致其他线程阻塞,其他3种情况均不会阻塞,所以读取的效率非常高。

可以看一下这个类的名称:CopyOnWrite,意思是在写入操作的时候,进行一次自我复制,换句话说,当这个List需要修改时,并不修改原有内容(这对于保证当前在读线程的数据一致性非常重要),而是在原有存放数据的数组上产生一个副本,在副本上修改数据,修改完毕之后,用副本替换原来的数组,这样也保证了写操作不会影响读

特性:

  • 迭代结果和存入顺序一致
  • 元素不重复
  • 元素可以为空
  • 线程安全的
  • 读读、读写、写读3种情况不会阻塞;写写会阻塞
  • 无界的

ConcurrentSkipListSet

有序的Set,内部基于ConcurrentSkipListMap实现的,放入的元素会进行排序,排序算法支持2种方式来指定:

  1. 通过构造方法传入一个Comparator
  2. 放入的元素实现Comparable接口
    上面2种方式需要实现一个,如果2种都有,走规则1

特性:

  • 迭代结果和存入顺序不一致
  • 放入的元素会排序
  • 元素不重复
  • 元素不能为空
  • 线程安全的
  • 无界的

CopyOnWriteArraySet

内部使用CopyOnWriteArrayList实现的,将所有的操作都会转发给CopyOnWriteArrayList。

特性:

  • 迭代结果和存入顺序不一致
  • 元素不重复
  • 元素可以为空
  • 线程安全的
  • 读读、读写、写读 不会阻塞;写写会阻塞
  • 无界的

ConcurrentLinkedQueue

高效并发队列,内部使用链表实现的。
特性:

  • 线程安全的
  • 迭代结果和存入顺序一致
  • 元素可以重复
  • 元素不能为空
  • 线程安全的
  • 无界队列

Deque

双向队列(Deque)是Queue的一个子接口,双向队列是指该队列两端的元素既能入队(offer)也能出队(poll),如果将Deque限制为只能从一端入队和出队,则可实现栈的数据结构。对于栈而言,有入栈(push)和出栈(pop),遵循先进后出原则。

一个线性 collection,支持在两端插入和移除元素。名称 deque 是“double ended queue(双端队列)”的缩写,通常读为“deck”。大多数 Deque 实现对于它们能够包含的元素数没有固定限制,但此接口既支持有容量限制的双端队列,也支持没有固定大小限制的双端队列。

此接口定义在双端队列两端访问元素的方法。提供插入、移除和检查元素的方法。每种方法都存在两种形式:一种形式在操作失败时抛出异常,另一种形式返回一个特殊值(null 或 false,具体取决于操作)。插入操作的后一种形式是专为使用有容量限制的 Deque 实现设计的;在大多数实现中,插入操作不能失败.

在这里插入图片描述

此接口扩展了 Queue接口。在将双端队列用作队列时,将得到 FIFO(先进先出)行为。将元素添加到双端队列的末尾,从双端队列的开头移除元素。从 Queue 接口继承的方法完全等效于 Deque 方法,如下表所示:

在这里插入图片描述

ConcurrentLinkedDeque

实现了Deque接口,内部使用链表实现的高效的并发双端队列。
特性:

  • 线程安全的
  • 迭代结果和存入顺序一致
  • 元素可以重复
  • 元素不能为空
  • 线程安全的
  • 无界队列

参考

第26篇:学会使用JUC中常见的集合

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值