学习笔记 07 --- JUC集合
Posted claireyuancy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习笔记 07 --- JUC集合相关的知识,希望对你有一定的参考价值。
1. List的实现类主要有: LinkedList, ArrayList, Vector, Stack。
(01) LinkedList是双向链表实现的双端队列;它不是线程安全的。仅仅适用于单线程。
(02) ArrayList是数组实现的队列,它是一个动态数组。它也不是线程安全的,仅仅适用于单线程。
(03) Vector是数组实现的矢量队列,它也一个动态数组;只是和ArrayList不同的是。Vector是线程安全的,它支持并发。
(04) Stack是Vector实现的栈;和Vector一样,它也是线程安全的。
2. Set的实现类主要有: HastSet和TreeSet。
(01) HashSet是一个没有反复元素的集合,它通过HashMap实现的;HashSet不是线程安全的。仅仅适用于单线程。
(02) TreeSet也是一个没有反复元素的集合,只是和HashSet不同的是,TreeSet中的元素是有序的。它是通过TreeMap实现的。TreeSet也不是线程安全的,仅仅适用于单线程。
3.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不是线程安全的。仅仅适用于单线程。
1. List和Set
JUC集合包中的List和Set实现类包含: CopyOnWriteArrayList, CopyOnWriteArraySet和ConcurrentSkipListSet。
ConcurrentSkipListSet稍后在说明Map时再说明,CopyOnWriteArrayList 和 CopyOnWriteArraySet的框架例如以下图所看到的:
(01) CopyOnWriteArrayList相当于线程安全的ArrayList。它实现了List接口。
CopyOnWriteArrayList是支持高并发的。
(02) CopyOnWriteArraySet相当于线程安全的HashSet,它继承于AbstractSet类。CopyOnWriteArraySet内部包括一个CopyOnWriteArrayList对象,它是通过CopyOnWriteArrayList实现的。
2. Map
JUC集合包中Map的实现类包含: ConcurrentHashMap和ConcurrentSkipListMap。它们的框架例如以下图所看到的:
(01) ConcurrentHashMap是线程安全的哈希表(相当于线程安全的HashMap)。它继承于AbstractMap类。而且实现ConcurrentMap接口。ConcurrentHashMap是通过“锁分段”来实现的,它支持并发。
(02) ConcurrentSkipListMap是线程安全的有序的哈希表(相当于线程安全的TreeMap); 它继承于AbstractMap类,而且实现ConcurrentNavigableMap接口。
ConcurrentSkipListMap是通过“跳表”来实现的,它支持并发。
(03) ConcurrentSkipListSet是线程安全的有序的集合(相当于线程安全的TreeSet)。它继承于AbstractSet,并实现了NavigableSet接口。ConcurrentSkipListSet是通过ConcurrentSkipListMap实现的。它也支持并发。
3. Queue
JUC集合包中Queue的实现类包含: ArrayBlockingQueue, LinkedBlockingQueue, LinkedBlockingDeque, ConcurrentLinkedQueue和ConcurrentLinkedDeque。
它们的框架例如以下图所看到的:
(01) ArrayBlockingQueue是数组实现的线程安全的有界的堵塞队列。
(02) LinkedBlockingQueue是单向链表实现的(指定大小)堵塞队列。该队列按 FIFO(先进先出)排序元素。
(03) LinkedBlockingDeque是双向链表实现的(指定大小)双向并发堵塞队列,该堵塞队列同一时候支持FIFO和FILO两种操作方式。
(04) ConcurrentLinkedQueue是单向链表实现的无界队列。该队列按 FIFO(先进先出)排序元素。
(05) ConcurrentLinkedDeque是双向链表实现的无界队列,该队列同一时候支持FIFO和FILO两种操作方式。
CopyOnWriteArrayList
CopyOnWriteArrayList与ArrayList相比具有的特性例如以下:
1.
它最适合于具有下面特征的应用程序:List 大小通常保持非常小,仅仅读操作远多于可变操作,须要在遍历期间防止线程间的冲突。
2. 它是线程安全的。
3. 由于通常须要复制整个基础数组,所以可变操作(add()、set() 和 remove() 等等)的开销非常大。
4. 迭代器支持hasNext(), next()等不可变操作,但不支持可变 remove()等操作。
5. 使用迭代器进行遍历的速度非常快,而且不会与其它线程发生冲突。在构造迭代器时,迭代器依赖于不变的数组快照。
// 创建一个空列表。 CopyOnWriteArrayList() // 创建一个按 collection 的迭代器返回元素的顺序包括指定 collection 元素的列表。 CopyOnWriteArrayList(Collection<?extends E> c) // 创建一个保存给定数组的副本的列表。
CopyOnWriteArrayList(E[] toCopyIn)
// 将指定元素加入到此列表的尾部。boolean add(E e) // 在此列表的指定位置上插入指定元素。 void add(int index, E element) // 依照指定 collection 的迭代器返回元素的顺序,将指定 collection 中的全部元素加入此列表的尾部。
boolean addAll(Collection<?
extends E> c) // 从指定位置開始,将指定 collection 的全部元素插入此列表。 boolean addAll(int index, Collection<? extends E> c) // 依照指定 collection 的迭代器返回元素的顺序,将指定 collection 中尚未包括在此列表中的全部元素加入列表的尾部。
int addAllAbsent(Collection<? extends E> c) // 加入元素(假设不存在)。 boolean addIfAbsent(E e) // 从此列表移除全部元素。 void clear() // 返回此列表的浅表副本。 Object clone() // 假设此列表包括指定的元素。则返回 true。 boolean contains(Object o) // 假设此列表包括指定 collection 的全部元素。则返回 true。
boolean containsAll(Collection<?> c) // 比較指定对象与此列表的相等性。 boolean equals(Object o) // 返回列表中指定位置的元素。 E get(int index) // 返回此列表的哈希码值。 int hashCode() // 返回第一次出现的指定元素在此列表中的索引。从 index 開始向前搜索,假设没有找到该元素,则返回 -1。 int indexOf(E e, int index) // 返回此列表中第一次出现的指定元素的索引。假设此列表不包括该元素,则返回 -1。
int indexOf(Object o) // 假设此列表不包括不论什么元素,则返回 true。 boolean isEmpty() // 返回以恰当顺序在此列表元素上进行迭代的迭代器。 Iterator<E> iterator() // 返回最后一次出现的指定元素在此列表中的索引,从 index 開始向后搜索,假设没有找到该元素,则返回 -1。 int lastIndexOf(E e, int index) // 返回此列表中最后出现的指定元素的索引。假设列表不包括此元素,则返回 -1。 int lastIndexOf(Object o) // 返回此列表元素的列表迭代器(按适当顺序)。 ListIterator<E> listIterator() // 返回列表中元素的列表迭代器(按适当顺序),从列表的指定位置開始。 ListIterator<E> listIterator(int index) // 移除此列表指定位置上的元素。
E remove(int index) // 从此列表移除第一次出现的指定元素(假设存在)。
boolean remove(Object o) // 从此列表移除全部包括在指定 collection 中的元素。
boolean removeAll(Collection<?> c) // 仅仅保留此列表中包括在指定 collection 中的元素。 boolean retainAll(Collection<?> c) // 用指定的元素替代此列表指定位置上的元素。
E set(int index, E element) // 返回此列表中的元素数。 int size() // 返回此列表中 fromIndex(包括)和 toIndex(不包括)之间部分的视图。 List<E> subList(int fromIndex, int toIndex) // 返回一个按恰当顺序(从第一个元素到最后一个元素)包括此列表中全部元素的数组。
Object[] toArray() // 返回以恰当顺序(从第一个元素到最后一个元素)包括列表全部元素的数组;返回数组的执行时类型是指定数组的执行时类型。 <T> T[] toArray(T[] a) // 返回此列表的字符串表示形式。 String toString()
之所以大部分操作都须要复制一份数组。所以须要复制的数组数据庞大的话,开销会非常大。
CopyOnWriteArraySet
CopyOnWriteArraySet和HashSet一样都继承了AbstractSet,可是HashSet是通过散列表HashMap来实现的。而CopyOnWriteArraySet是通过动态数组CopyOnWriteArrayList来实现的。
所以CopyOnWriteArraySet和CopyOnWriteArrayList一样有例如以下特性:
1. 它最适合于具有下面特征的应用程序:List 大小通常保持非常小,仅仅读操作远多于可变操作,须要在遍历期间防止线程间的冲突。
2. 它是线程安全的。
3. 由于通常须要复制整个基础数组,所以可变操作(add()、set() 和 remove() 等等)的开销非常大。
4. 迭代器支持hasNext(), next()等不可变操作,但不支持可变 remove()等操作。
5. 使用迭代器进行遍历的速度非常快,而且不会与其它线程发生冲突。在构造迭代器时。迭代器依赖于不变的数组快照。
2. CopyOnWriteArraySet包括CopyOnWriteArrayList对象,它是通过CopyOnWriteArrayList实现的。而CopyOnWriteArrayList本质是个动态数组队列,所以CopyOnWriteArraySet相当于通过通过动态数组实现的“集合”!
CopyOnWriteArrayList中同意有反复的元素。可是。CopyOnWriteArraySet是一个集合。它不能有反复集合。
因此。CopyOnWriteArrayList额外提供了addIfAbsent()和addAllAbsent()这两个加入元素的API,通过这些API来加入元素时。仅仅有当元素不存在时才运行加入操作。
// 创建一个空 set。CopyOnWriteArraySet() // 创建一个包括指定 collection 全部元素的 set。 CopyOnWriteArraySet(Collection<? extends E> c) // 假设指定元素并不存在于此 set 中。则加入它。
boolean add(E e) // 假设此 set 中没有指定 collection 中的全部元素,则将它们都加入到此 set 中。 boolean addAll(Collection<? extends E> c) // 移除此 set 中的全部元素。 void clear() // 假设此 set 包括指定元素,则返回 true。 boolean contains(Object o) // 假设此 set 包括指定 collection 的全部元素。则返回 true。 boolean containsAll(Collection<?
> c) // 比較指定对象与此 set 的相等性。 boolean equals(Object o) // 假设此 set 不包括不论什么元素。则返回 true。 boolean isEmpty() // 返回依照元素加入顺序在此 set 中包括的元素上进行迭代的迭代器。
Iterator<E> iterator() // 假设指定元素存在于此 set 中,则将其移除。 boolean remove(Object o) // 移除此 set 中包括在指定 collection 中的全部元素。
boolean removeAll(Collection<?> c) // 仅保留此 set 中那些包括在指定 collection 中的元素。 boolean retainAll(Collection<?> c) // 返回此 set 中的元素数目。 int size() // 返回一个包括此 set 全部元素的数组。 Object[] toArray() // 返回一个包括此 set 全部元素的数组。返回数组的执行时类型是指定数组的类型。 <T> T[] toArray(T[] a)
多线程对同一个片段的訪问。是相互排斥的;可是,对于不同片段的訪问,却是能够同步进行的。
以上是关于学习笔记 07 --- JUC集合的主要内容,如果未能解决你的问题,请参考以下文章