目录
第I部分 Java集合框架 1
第1章 JCF中的List集合 3
1.1 List集合概要和重要接口介绍 3
1.1.1 java.lang.Iterable接口 4
1.1.2 java.util.Collection接口 5
1.1.3 java.util.AbstractList抽象类 6
1.1.4 java.util.RandomAccess接口 7
1.2 List集合实现――Vector 14
1.2.1 Vector集合的扩容操作 16
1.2.2 Vector集合的修改方法――set(int, E) 19
1.2.3 Vector集合的删除方法――removeElementAt(int) 20
1.3 List集合实现――ArrayList 22
1.3.1 ArrayList集合概述 23
1.3.2 ArrayList集合的初始化操作和扩容操作 23
1.3.3 ArrayList集合中的add(E)方法 26
1.3.4 Vector集合与ArrayList集合对比 28
1.4 List集合实现――Stack 29
1.5 List集合实现――LinkedList 32
1.5.1 LinkedList集合的主要结构 33
1.5.2 LinkedList集合的添加操作 35
1.5.3 LinkedList集合的移除操作 40
1.5.4 LinkedList集合的查找操作 44
1.5.5 使用LinkedList集合的栈工作特性 46
1.6 LinkedList集合与ArrayList集合的对比 48
1.6.1 两种集合写操作性能的比较 48
1.6.2 两种集合读操作性能的比较 49
1.6.3 不同遍历方式对LinkedList集合的意义 50
1.6.4 在什么场景中推荐选择LinkedList集合 54
第2章 JCF中的Queue、Deque集合 55
2.1 Queue集合实现――ArrayDeque 56
2.1.1 ArrayDeque集合的主要结构及相关方法 57
2.1.2 ArrayDeque集合的初始化过程 60
2.1.3 ArrayDeque集合的添加操作 61
2.1.4 ArrayDeque集合的扩容操作 64
2.2 堆和堆排序 67
2.2.1 树、二叉树 67
2.2.2 堆、小顶堆、大顶堆 69
2.2.3 堆的降维――使用数组表示堆结构 71
2.2.4 堆排序 72
2.2.5 自行完成一个堆排序 75
2.3 Queue集合实现――PriorityQueue 77
2.3.1 PriorityQueue队列的基本使用方法 77
2.3.2 PriorityQueue队列的构造 78
2.3.3 PriorityQueue队列的核心工作原理 82
2.3.4 PriorityQueue队列的扩容操作 88
2.3.5 PriorityQueue队列的添加操作 90
2.3.6 PriorityQueue队列的移除操作 90
第3章 JCF中的Map集合 94
3.1 Map集合概述 94
3.1.1 K-V键值对节点定义――Entry 95
3.1.2 与Map集合有关的重要接口和抽象类 97
3.2 红黑树略讲 103
3.2.1 二叉查找树(二叉搜索树) 104
3.2.2 二叉查找树的查找操作和添加操作 105
3.2.3 为什么需要红黑树 107
3.2.4 红黑树的基本结构 107
3.2.5 红黑树的操作规则 108
3.2.6 红黑树的节点添加操作 110
3.2.7 红黑树的节点删除操作 120
3.3 Map集合实现――TreeMap 136
3.3.1 TreeMap集合的基本使用方法 136
3.3.2 TreeMap集合的重要属性和方法 138
3.4 Map集合实现――HashMap 148
3.4.1 HashMap集合的结构 150
3.4.2 HashMap集合的主要工作过程 155
3.4.3 向HashMap集合中添加K-V键值对节点(链表方式) 158
3.4.4 向HashMap集合中添加K-V键值对节点(红黑树方式) 160
3.4.5 HashMap集合红黑树、链表互相转换 165
3.4.6 HashMap集合的扩容操作 172
3.5 Map集合实现――LinkedHashMap 180
3.5.1 LinkedHashMap集合的节点结构 182
3.5.2 LinkedHashMap集合的主要结构 184
3.5.3 LinkedHashMap集合的迭代器 186
第4章 JCF的Set集合 191
4.1 Set集合概述 192
4.1.1 java.util.SortedSet接口 192
4.1.2 java.util.NavigableSet接口 195
4.1.3 java.util.AbstractSet抽象类 199
4.2 Set集合实现――HashSet 200
4.2.1 HashSet集合的主要属性 201
4.2.2 HashSet集合的构造方法 201
4.2.3 HashSet集合的主要操作方法 202
4.3 Set集合实现――LinkedHashSet、TreeSet 203
4.3.1 LinkedHashSet集合 203
4.3.2 TreeSet集合 204
第II部分 JUC与高并发概述 208
第5章 Object Monitor管程实现 212
5.1 悲观锁和乐观锁 212
5.2 synchronized修饰符和线程控制 215
5.2.1 线程的基本特点 215
5.2.2 线程状态切换和操作方法 216
5.3 Object Monitor基本结构概要 227
5.3.1 synchronized修饰符和锁升级过程 228
5.3.2 管程与synchronized修饰符 233
5.3.3 对线程状态切换示意图进行细化 235
5.4 使用jstack命令观察线程状态 237
5.4.1 jstack基本命令 237
5.4.2 jstack命令中的线程关键信息 238
5.4.3 线程状态及切换方式(仅限Object Monitor模式) 240
5.5 Object Monitor模式总结 244
5.5.1 as-if-serial语义原则与happens-before规则 244
5.5.2 Object Monitor模式如何保证三性 246
5.5.3 Object Monitor模式如何解决互斥、同步问题 248
第6章 JUC的必要组成部分 250
6.1 Unsafe工具类 252
6.1.1 在源码中使用Unsafe工具类 252
6.1.2 Unsafe工具类中的典型方法讲解 255
6.2 LockSupport工具类 261
6.2.1 park()方法和unpark()方法的使用示例 261
6.2.2 LockSupport工具类的主要属性和方法 263
6.3 线程状态 266
6.3.1 使用jstack命令观察线程状态 266
6.3.2 更详细的线程状态说明 269
6.3.3 其他常用命令 271
6.4 volatile修饰符 275
6.4.1 为什么需要Java内存模型 275
6.4.2 内存可见性问题和MESI协议 277
6.4.3 存储缓存和失效队列 281
6.4.4 内存屏障与数据一致性 283
6.4.5 内存屏障与指令重排 285
6.4.6 volatile修饰符和内存屏障 289
6.5 轻量化的原子性操作方法 300
6.5.1 原子性操作――AtomicInteger类 301
6.5.2 原子性操作――AtomicStampedReference类 301
6.5.3 使用变量句柄完成原子性操作 303
第7章 另一种管程实现――AQS技术 305
7.1 AQS技术的基本原理 306
7.1.1 AQS技术的工作过程概要及使用示例 306
7.1.2 AQS技术中的关键定义 308
7.2 AQS实现――ReentrantLock类 325
7.2.1 ReentrantLock类的使用方法 325
7.2.2 AQS技术如何帮助ReentrantLock类工作 327
7.3 AQS实现――Condition控制 332
7.3.1 基本使用方法 332
7.3.2 ReentrantLock类如何进行Condition控制 334
7.4 AQS技术总结 342
第III部分 在高并发场景中工作的集合 345
第8章 高并发场景中的List、Map和Set集合 346
8.1 List集合实现――CopyOnWriteArrayList 346
8.1.1 CopyOnWriteArrayList集合概述 346
8.1.2 CopyOnWriteArrayList集合的主要构造方法 348
8.1.3 CopyOnWriteArrayList集合的主要方法 349
8.1.4 java.util.Collections.synchronizedList()方法的补充作用 352
8.2 Map集合实现――ConcurrentHashMap 355
8.2.1 ConcurrentHashMap集合概述 355
8.2.2 ConcurrentHashMap集合的主要属性 358
8.2.3 ConcurrentHashMap集合的主要工作过程 359
8.3 高并发场景中的List、Map、Set集合说明 378
第9章 高并发场景中的Queue集合 380
9.1 概述 380
9.1.1 什么是有界队列,什么是无界队列 381
9.1.2 什么是阻塞队列,什么是非阻塞队列 382
9.2 Queue集合实现――ArrayBlockingQueue 384
9.2.1 ArrayBlockingQueue队列的基本使用方法 385
9.2.2 ArrayBlockingQueue队列的工作原理 388
9.3 Queue集合实现――LinkedBlockingQueue 396
9.3.1 LinkedBlockingQueue队列的重要属性 397
9.3.2 LinkedBlockingQueue队列的构造方法 399
9.3.3 入队操作和出队操作 401
9.3.4 LinkedBlockingQueue队列的主要方法 404
9.4 Queue集合实现――LinkedTransferQueue 413
9.4.1 LinkedTransferQueue队列的基本使用场景 414
9.4.2 LinkedTransferQueue队列的主要结构 416
9.4.3 LinkedTransferQueue队列的主要工作过程 420
9.4.4 LinkedTransferQueue队列的主要方法 437
9.5 Queue集合实现――PriorityBlockingQueue 438
9.5.1 PriorityBlockingQueue队列的主要属性 439
9.5.2 PriorityBlockingQueue队列的主要构造方法 440
9.5.3 PriorityBlockingQueue队列的扩容过程 442
9.5.4 PriorityBlockingQueue队列的典型操作方法 444
9.6 Queue集合实现――DelayQueue 446
9.6.1 java.util.concurrent.Delayed接口与基本使用方法 447
9.6.2 DelayQueue队列的主要属性和构造方法 449
9.6.3 DelayQueue队列的主要工作过程 450
第10章 高并发场景中的集合总结 454
10.1 还有哪些高并发场景中的常用集合没有被提及 454
10.2 典型集合对应关系对比 455
10.3 高并发场景中的集合可借鉴的设计思想 455
10.3.1 使用JUC提供的基本要素保证线程安全性 456
10.3.2 通过复合手段保证多场景中的性能平衡性 457
10.3.3 更多提升性能的手段 458