死磕 java集合之终结篇
概览
我们先来看一看java中所有集合的类关系图。
这里面的类太多了,请放大看,如果放大还看不清,请再放大看,如果还是看不清,请放弃。
我们下面主要分成五个部分来逐个击破。
List
List中的元素是有序的、可重复的,主要实现方式有动态数组和链表。
java中提供的List的实现主要有ArrayList、LinkedList、CopyOnWriteArrayList,另外还有两个古老的类Vector和Stack。
关于List相关的问题主要有:
(1)ArrayList和LinkedList有什么区别?
(2)ArrayList是怎么扩容的?
(3)ArrayList插入、删除、查询元素的时间复杂度各是多少?
(4)怎么求两个集合的并集、交集、差集?
(5)ArrayList是怎么实现序列化和反序列化的?
(6)集合的方法toArray()有什么问题?
(7)什么是fail-fast?
(8)LinkedList是单链表还是双链表实现的?
(9)LinkedList除了作为List还有什么用处?
(10)LinkedList插入、删除、查询元素的时间复杂度各是多少?
(11)什么是随机访问?
(12)哪些集合支持随机访问?他们都有哪些共性?
(13)CopyOnWriteArrayList是怎么保证并发安全的?
(14)CopyOnWriteArrayList的实现采用了什么思想?
(15)CopyOnWriteArrayList是不是强一致性的?
(16)CopyOnWriteArrayList适用于什么样的场景?
(17)CopyOnWriteArrayList插入、删除、查询元素的时间复杂度各是多少?
(18)CopyOnWriteArrayList为什么没有size属性?
(19)比较古老的集合Vector和Stack有什么缺陷?
关于List的问题大概就这么多,你都能回答上来吗?
点击下面链接可以直接到相应的章节查看:
死磕 java集合之CopyOnWriteArrayList源码分析
Map
Map是一种(key/value)的映射结构,其它语言里可能称作字典(Dictionary),包括java早期也是叫做字典,Map中的元素是一个key只能对应一个value,不能存在重复的key。
java中提供的Map的实现主要有HashMap、LinkedHashMap、WeakHashMap、TreeMap、ConcurrentHashMap、ConcurrentSkipListMap,另外还有两个比较古老的Map实现HashTable和Properties。
关于Map的问题主要有:
(1)什么是散列表?
(2)怎么实现一个散列表?
(3)java中HashMap实现方式的演进?
(4)HashMap的容量有什么特点?
(5)HashMap是怎么进行扩容的?
(6)HashMap中的元素是否是有序的?
(7)HashMap何时进行树化?何时进行反树化?
(8)HashMap是怎么进行缩容的?
(9)HashMap插入、删除、查询元素的时间复杂度各是多少?
(10)HashMap中的红黑树实现部分可以用其它数据结构代替吗?
(11)LinkedHashMap是怎么实现的?
(12)LinkedHashMap是有序的吗?怎么个有序法?
(13)LinkedHashMap如何实现LRU缓存淘汰策略?
(14)WeakHashMap使用的数据结构?
(15)WeakHashMap具有什么特性?
(16)WeakHashMap通常用来做什么?
(17)WeakHashMap使用String作为key是需要注意些什么?为什么?
(18)什么是弱引用?
(19)红黑树具有哪些特性?
(20)TreeMap就有序的吗?怎么个有序法?
(21)TreeMap是否需要扩容?
(22)什么是左旋?什么是右旋?
(23)红黑树怎么插入元素?
(24)红黑树怎么删除元素?
(25)为什么要进行平衡?
(26)如何实现红黑树的遍历?
(27)TreeMap中是怎么遍历的?
(28)TreeMap插入、删除、查询元素的时间复杂度各是多少?
(29)HashMap在多线程环境中什么时候会出现问题?
(30)ConcurrentHashMap的存储结构?
(31)ConcurrentHashMap是怎么保证并发安全的?
(32)ConcurrentHashMap是怎么扩容的?
(33)ConcurrentHashMap的size()方法的实现知多少?
(34)ConcurrentHashMap是强一致性的吗?
(35)ConcurrentHashMap不能解决什么问题?
(36)ConcurrentHashMap中哪些地方运用到分段锁的思想?
(37)什么是伪共享?怎么避免伪共享?
(38)什么是跳表?
(40)ConcurrentSkipList是有序的吗?
(41)ConcurrentSkipList是如何保证线程安全的?
(42)ConcurrentSkipList插入、删除、查询元素的时间复杂度各是多少?
(43)ConcurrentSkipList的索引具有什么特性?
(44)为什么Redis选择使用跳表而不是红黑树来实现有序集合?
关于Map的问题大概就这么多,你都能回答上来吗?
点击下面链接可以直接到相应的章节查看:
死磕 java集合之ConcurrentHashMap源码分析(一)
死磕 java集合之ConcurrentHashMap源码分析(二)
死磕 java集合之ConcurrentHashMap源码分析(三)
死磕 java集合之ConcurrentSkipListMap源码分析
Set
java里面的Set对应于数学概念上的集合,里面的元素是不可重复的,通常使用Map或者List来实现。
java中提供的Set的实现主要有HashSet、LinkedHashSet、TreeSet、CopyOnWriteArraySet、ConcurrentSkipSet。
关于Set的问题主要有:
(1)HashSet怎么保证添加元素不重复?
(2)HashSet是有序的吗?
(3)HashSet是否允许null元素?
(4)Set是否有get()方法?
(5)LinkedHashSet是有序的吗?怎么个有序法?
(6)LinkedHashSet支持按元素访问顺序排序吗?
(8)TreeSet真的是使用TreeMap来存储元素的吗?
(9)TreeSet是有序的吗?怎么个有序法?
(10)TreeSet和LinkedHashSet有何不同?
(11)TreeSet和SortedSet有什么区别和联系?
(12)CopyOnWriteArraySet是用Map实现的吗?
(13)CopyOnWriteArraySet是有序的吗?怎么个有序法?
(14)CopyOnWriteArraySet怎么保证并发安全?
(15)CopyOnWriteArraySet以何种方式保证元素不重复?
(16)如何比较两个Set中的元素是否完全一致?
(17)ConcurrentSkipListSet的底层是ConcurrentSkipListMap吗?
(18)ConcurrentSkipListSet是有序的吗?怎么个有序法?
关于Set的问题大概就这么多,你都能回答上来吗?
点击下面链接可以直接到相应的章节查看:
死磕 java集合之CopyOnWriteArraySet源码分析
死磕 java集合之ConcurrentSkipListSet源码分析
Queue
Queue是一种叫做队列的数据结构,队列是遵循着一定原则的入队出队操作的集合,一般来说,入队是在队列尾添加元素,出队是在队列头删除元素,但是,也不一定,比如优先级队列的原则就稍微有些不同。
java中提供的Queue的实现主要有PriorityQueue、ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue、PriorityBlockingQueue、LinkedTransferQueue、DelayQueue、ConcurrentLinkedQueue。
关于Queue的问题主要有:
(1)什么是堆?什么是堆化?
(2)什么是优先级队列?
(3)PriorityQueue是怎么实现的?
(4)PriorityQueue是有序的吗?
(5)PriorityQueue入队、出队的时间复杂度各是多少?
(6)PriorityQueue是否需要扩容?扩容规则呢?
(7)ArrayBlockingQueue的实现方式?
(8)ArrayBlockingQueue是否需要扩容?
(9)ArrayBlockingQueue怎么保证线程安全?
(9)ArrayBlockingQueue有什么缺点?
(10)LinkedBlockingQueue的实现方式?
(11)LinkedBlockingQueue是有界的还是无界的队列?
(12)LinkedBlockingQueue怎么保证线程安全?
(13)LinkedBlockingQueue与ArrayBlockingQueue对比?
(14)SynchronousQueue的实现方式?
(15)SynchronousQueue真的是无缓冲的吗?
(16)SynchronousQueue怎么保证线程安全?
(17)SynchronousQueue的公平模式和非公平模式有什么区别?
(18)SynchronousQueue在高并发情景下会有什么问题?
(19)PriorityBlockingQueue的实现方式?
(20)PriorityBlockingQueue是否需要扩容?
(21)PriorityBlockingQueue怎么保证线程安全?
(22)PriorityBlockingQueue为什么不需要notFull条件?
(23)什么是双重队列?
(24)LinkedTransferQueue是怎么实现阻塞队列的?
(25)LinkedTransferQueue是怎么控制并发安全的?
(26)LinkedTransferQueue与SynchronousQueue有什么异同?
(27)ConcurrentLinkedQueue是阻塞队列吗?
(28)ConcurrentLinkedQueue如何保证并发安全?
(29)ConcurrentLinkedQueue能用于线程池吗?
(30)DelayQueue是阻塞队列吗?
(31)DelayQueue的实现方式?
(32)DelayQueue主要用于什么场景?
关于Queue的问题大概就这么多,你都能回答上来吗?
点击下面链接可以直接到相应的章节查看:
死磕 java集合之ArrayBlockingQueue源码分析
死磕 java集合之LinkedBlockingQueue源码分析
死磕 java集合之SynchronousQueue源码分析
死磕 java集合之PriorityBlockingQueue源码分析
死磕 java集合之LinkedTransferQueue源码分析
死磕 java集合之ConcurrentLinkedQueue源码分析
Deque
Deque是一种特殊的队列,它的两端都可以进出元素,故而得名双端队列(Double Ended Queue)。
java中提供的Deque的实现主要有ArrayDeque、LinkedBlockingDeque、ConcurrentLinkedDeque、LinkedList。
关于Deque的问题主要有:
(1)什么是双端队列?
(2)ArrayDeque是怎么实现双端队列的?
(3)ArrayDeque是有界的吗?
(4)LinkedList与ArrayDeque的对比?
(5)双端队列是否可以作为栈使用?
(6)LinkedBlockingDeque是怎么实现双端队列的?
(7)LinkedBlockingDeque是怎么保证并发安全的?
(8)ConcurrentLinkedDeque是怎么实现双端队列的?
(9)ConcurrentLinkedDeque是怎么保证并发安全的?
(10)LinkedList是List和Deque的集合体?
关于Deque的问题大概就这么多,你都能回答上来吗?
点击下面链接可以直接到相应的章节查看(LinkedBlockingDeque和ConcurrentLinkedDeque跟相应的Queue的实现方式基本一致,所以笔者没写这两个类的源码分析):
总结
其实上面的问题很多都具有共性,我觉得以下几个问题在看每个集合类的时候都要掌握清楚:
(1)使用的数据结构?
(2)添加元素、删除元素的基本逻辑?
(3)是否是fail-fast的?
(4)是否需要扩容?扩容规则?
(5)是否有序?是按插入顺序还是自然顺序还是访问顺序?
(6)是否线程安全?
(7)使用的锁?
(8)优点?缺点?
(9)适用的场景?
(10)时间复杂度?
(11)空间复杂度?
(12)还有呢?
彩蛋
到这里整个集合的内容就全部完毕了,其实看了这么多集合的源码之后,笔者发现,基本上所有集合类使用的数据结构都是数组和链表,包括树和跳表也可以看成是链表的一种方式。
对于并发安全的集合,还要再加上相应的锁策略,要不就是重入锁,要不就是CAS+自旋,偶尔也来个synchronized。
所以,掌握集合的源码不算什么,数据结构和锁才是王道。
预告:下一个专题是java并发包,也就是著名的JUC,当然这里是除了并发集合以外的内容,也就是原子类、各种锁、线程池三块硬骨头。
欢迎关注我的公众号“彤哥读源码”,查看更多源码系列文章, 与彤哥一起畅游源码的海洋。
死磕 java集合之终结篇的更多相关文章
- 死磕 java集合之PriorityQueue源码分析
问题 (1)什么是优先级队列? (2)怎么实现一个优先级队列? (3)PriorityQueue是线程安全的吗? (4)PriorityQueue就有序的吗? 简介 优先级队列,是0个或多个元素的集合 ...
- 死磕 java集合之CopyOnWriteArraySet源码分析——内含巧妙设计
问题 (1)CopyOnWriteArraySet是用Map实现的吗? (2)CopyOnWriteArraySet是有序的吗? (3)CopyOnWriteArraySet是并发安全的吗? (4)C ...
- 【死磕 Java 集合】— ConcurrentSkipListMap源码分析
转自:http://cmsblogs.com/?p=4773 [隐藏目录] 前情提要 简介 存储结构 源码分析 主要内部类 构造方法 添加元素 添加元素举例 删除元素 删除元素举例 查找元素 查找元素 ...
- 死磕 java集合之DelayQueue源码分析
问题 (1)DelayQueue是阻塞队列吗? (2)DelayQueue的实现方式? (3)DelayQueue主要用于什么场景? 简介 DelayQueue是java并发包下的延时阻塞队列,常用于 ...
- 死磕 java集合之PriorityBlockingQueue源码分析
问题 (1)PriorityBlockingQueue的实现方式? (2)PriorityBlockingQueue是否需要扩容? (3)PriorityBlockingQueue是怎么控制并发安全的 ...
- 死磕 java集合之LinkedHashSet源码分析
问题 (1)LinkedHashSet的底层使用什么存储元素? (2)LinkedHashSet与HashSet有什么不同? (3)LinkedHashSet是有序的吗? (4)LinkedHashS ...
- 死磕 java集合之ConcurrentHashMap源码分析(三)
本章接着上两章,链接直达: 死磕 java集合之ConcurrentHashMap源码分析(一) 死磕 java集合之ConcurrentHashMap源码分析(二) 删除元素 删除元素跟添加元素一样 ...
- 死磕 java集合之ArrayDeque源码分析
问题 (1)什么是双端队列? (2)ArrayDeque是怎么实现双端队列的? (3)ArrayDeque是线程安全的吗? (4)ArrayDeque是有界的吗? 简介 双端队列是一种特殊的队列,它的 ...
- 死磕 java集合之HashSet源码分析
问题 (1)集合(Collection)和集合(Set)有什么区别? (2)HashSet怎么保证添加元素不重复? (3)HashSet是否允许null元素? (4)HashSet是有序的吗? (5) ...
随机推荐
- 蓝牙4.0BLE cc2540 usb-dongle的 SmartRF Packet Sniffer 抓取数据方法 【原创,多图】
蓝牙4.0BLE cc2540 usb-dongle的 SmartRF Packet Sniffer 抓取数据方法 [原创,多图] spm=a1z10.1.w4004-5319414070.11.Zd ...
- Codeforces Round #310 (Div. 1) C. Case of Chocolate (线段树)
题目地址:传送门 这题尽管是DIV1的C. . 可是挺简单的. .仅仅要用线段树分别维护一下横着和竖着的值就能够了,先离散化再维护. 每次查找最大的最小值<=tmp的点,能够直接在线段树里搜,也 ...
- Supporting IPv6-only Networks
Supporting IPv6-only Networks - Support - Apple Developer https://developer.apple.com/support/ipv6/ ...
- AWS携手上海嘉定政府推出首个联合孵化器 为创业公司拓展AWS云服务可用资源
2014年10月17日 AWS Activate创业加速计划为中国创业公司提供各种支持,包含AWS全球和中国区服务抵扣券.培训和开发人员支持.同一时候,AWS携手上海嘉定政府成立首家联合孵化器,为创业 ...
- (19)javaWeb项目名称修改
1,选中项目,[右键]-[Refactor]-[Rename] 在弹出面板中,填写New Name 点击[OK] 2,改变运行时目录名称 选中项目[右键]-[Properties] 在弹框中选择选择[ ...
- IDEA及时更新js代码
需要在Tomcat的设置中为: on ‘update‘ action:当用户主动执行更新的时候更新 快捷键:Ctrl + F9 on frame deactication:在编辑窗口失去焦点的时候更新 ...
- ORACLE 创建视图索引序列
/* 视图View 视图是从若干基本表和(或)其他视图构造出来的表 视图存放的都是查询语句,并没有真实的数据 虚表 作用 限制对数据的操作 复杂查询变简单 提供相同数据的不同显示 UNION ALL ...
- 网络驱动移植之net_device结构体及其相关的操作函数
内核源码:Linux-2.6.38.8.tar.bz2 在Linux系统中,网络设备都被抽象为struct net_device结构体.它是网络设备硬件与上层协议之间联系的接口,了解它对编写网络驱动程 ...
- Linux使用笔记: 使用Samba访问windows的共享目录(转载)
转自:http://easwy.com/blog/archives/mount-a-windows-shared-folder-on-linux-with-samba/ 通常我们使用Samba都是在W ...
- python 面向对象八 多继承
python是支持多继承的,在设计类的继承关系时,通常,主线都是单一继承下来的.但是,如果需要“混入”额外的功能,通过多重继承就可以实现,这种设计通常称之为MixIn. 为了更好地看出继承关系,以Mi ...