Java集合包
1.List的实现类主要有: LinkedList, ArrayList, Vector, Stack。
2.Set的实现类主要有: HastSet和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不是线程安全的,只适用于单线程
JUC中的集合类
CopyOnWriteArrayList
1. CopyOnWriteArrayList的“动态数组”机制
它内部有个“volatile数组”(array)来保持数据。在“添加/修改/删除”数据时,都会新建一个数组,并将更新后的数据拷贝到新建的数组中,最后再将该数组赋值给“volatile数组”。
2. CopyOnWriteArrayList的“线程安全”机制
CopyOnWriteArrayList通过互斥锁来保护数据。在“添加/修改/删除”数据时,会先“获取互斥锁”,再修改完毕之后,先将数据更新到“volatile数组”中,然后再“释放互斥锁”;这样,就达到了保护数据的目的。
CopyOnWriteArraySet
CopyOnWriteArraySet是通过CopyOnWriteArrayList实现的,
ConcurrentHashMap
(01) ConcurrentHashMap继承于AbstractMap抽象类。
(02) Segment是ConcurrentHashMap中的内部类,它就是ConcurrentHashMap中的“锁分段”对应的存储结构。ConcurrentHashMap与Segment是组合关系,1个ConcurrentHashMap对象包含若干个Segment对象。在代码中,这表现为ConcurrentHashMap类中存在“Segment数组”成员。
(03) Segment类继承于ReentrantLock类,所以Segment本质上是一个可重入的互斥锁。
(04) HashEntry也是ConcurrentHashMap的内部类,是单向链表节点,存储着key-value键值对。Segment与HashEntry是组合关系,Segment类中存在“HashEntry数组”成员,“HashEntry数组”中的每个HashEntry就是一个单向链表
ConcurrentSkipListMap
跳表(Skip List),它是平衡树的一种替代的数据结构,但是和红黑树不相同的是,跳表对于树的平衡的实现是基于一种随机化的算法的,这样也就是说跳表的插入和删除的工作是比较简单的。
分支主题
ConcurrentSkipListSet
ConcurrentSkipListSet是通过ConcurrentSkipListMap实现的
TreeSet是通过TreeMap实现的。
ArrayBlockingQueue
ArrayBlockingQueue是数组实现的线程安全的有界的阻塞队列。FIFO
分支主题
LinkedBlockingQueue
是一个单向链表实现的阻塞队列。FIFO,默认容量大小等于Integer.MAX_VALUE。
分支主题
LinkedBlockingDeque
LinkedBlockingDeque是双向链表实现的双向并发阻塞队列。该阻塞队列同时支持FIFO和FILO两种操作方式
分支主题
ConcurrentLinkedQueue
是一个基于链接节点的无界线程安全队列,按照 FIFO,不可以放置null元素
分支主题