集合系列
tangtong1
这个作者很懒,什么都没留下…
展开
-
死磕 java集合之ArrayList源码分析
死磕 jdk源码之ArrayList简介ArrayList是一种以数组实现的List,与数组相比,它具有动态扩展的能力,因此也可称之为动态数组。继承体系ArrayList实现了List, RandomAccess, Cloneable, java.io.Serializable等接口。ArrayList实现了List,提供了基础的添加、删除、遍历等操作。ArrayList实现了Ran...原创 2019-03-29 16:07:56 · 586 阅读 · 1 评论 -
死磕 java集合之PriorityQueue源码分析
问题(1)什么是优先级队列?(2)怎么实现一个优先级队列?(3)PriorityQueue是线程安全的吗?(4)PriorityQueue就有序的吗?简介优先级队列,是0个或多个元素的集合,集合中的每个元素都有一个权重值,每次出队都弹出优先级最大或最小的元素。一般来说,优先级队列使用堆来实现。还记得堆的相关知识吗?链接直达【拜托,面试别再问我堆(排序)了!】。那么Java里面是如...原创 2019-04-20 22:24:23 · 210 阅读 · 0 评论 -
死磕 java集合之TreeSet源码分析
问题(1)TreeSet真的是使用TreeMap来存储元素的吗?(2)TreeSet是有序的吗?(3)TreeSet和LinkedHashSet有何不同?简介TreeSet底层是采用TreeMap实现的一种Set,所以它是有序的,同样也是非线程安全的。源码分析经过前面我们学习HashSet和LinkedHashSet,基本上已经掌握了Set实现的套路了。所以,也不废话了,直接上源码...原创 2019-04-16 20:55:01 · 246 阅读 · 0 评论 -
死磕 java集合之SynchronousQueue源码分析
原创 2019-04-25 23:02:01 · 212 阅读 · 0 评论 -
死磕 java集合之ArrayBlockingQueue源码分析
问题(1)ArrayBlockingQueue的实现方式?(2)ArrayBlockingQueue是否需要扩容?(3)ArrayBlockingQueue有什么缺点?简介ArrayBlockingQueue是java并发包下一个以数组实现的阻塞队列,它是线程安全的,至于是否需要扩容,请看下面的分析。队列队列,是一种线性表,它的特点是先进先出,又叫FIFO,就像我们平常排队一样,先到...原创 2019-04-21 22:40:38 · 187 阅读 · 0 评论 -
死磕 java集合之PriorityBlockingQueue源码分析
问题(1)PriorityBlockingQueue的实现方式?(2)PriorityBlockingQueue是否需要扩容?(3)PriorityBlockingQueue是怎么控制并发安全的?简介PriorityBlockingQueue是java并发包下的优先级阻塞队列,它是线程安全的,如果让你来实现你会怎么实现它呢?还记得我们前面介绍过的PriorityQueue吗?点击链接直...原创 2019-04-26 09:04:20 · 196 阅读 · 0 评论 -
死磕 java集合之CopyOnWriteArraySet源码分析——内含巧妙设计
问题(1)CopyOnWriteArraySet是用Map实现的吗?(2)CopyOnWriteArraySet是有序的吗?(3)CopyOnWriteArraySet是并发安全的吗?(4)CopyOnWriteArraySet以何种方式保证元素不重复?(5)如何比较两个Set中的元素是否完全一致?简介CopyOnWriteArraySet底层是使用CopyOnWriteArrayL...原创 2019-04-17 22:12:33 · 247 阅读 · 0 评论 -
死磕 java集合之LinkedBlockingQueue源码分析
原创 2019-04-22 22:21:03 · 198 阅读 · 0 评论 -
死磕 java集合之LinkedTransferQueue源码分析
问题(1)LinkedTransferQueue是什么东东?(2)LinkedTransferQueue是怎么实现阻塞队列的?(3)LinkedTransferQueue是怎么控制并发安全的?(4)LinkedTransferQueue与SynchronousQueue有什么异同?简介LinkedTransferQueue是LinkedBlockingQueue、Synchronous...原创 2019-04-27 18:38:41 · 194 阅读 · 0 评论 -
死磕 java集合之ConcurrentLinkedQueue源码分析
问题(1)ConcurrentLinkedQueue是阻塞队列吗?(2)ConcurrentLinkedQueue如何保证并发安全?(3)ConcurrentLinkedQueue能用于线程池吗?简介ConcurrentLinkedQueue只实现了Queue接口,并没有实现BlockingQueue接口,所以它不是阻塞队列,也不能用于线程池中,但是它是线程安全的,可用于多线程环境中。...原创 2019-04-27 23:40:03 · 157 阅读 · 0 评论 -
死磕 java集合之ConcurrentSkipListSet源码分析——Set大汇总
问题(1)ConcurrentSkipListSet的底层是ConcurrentSkipListMap吗?(2)ConcurrentSkipListSet是线程安全的吗?(3)ConcurrentSkipListSet是有序的吗?(4)ConcurrentSkipListSet和之前讲的Set有何不同?简介ConcurrentSkipListSet底层是通过ConcurrentNavi...原创 2019-04-18 21:24:19 · 968 阅读 · 0 评论 -
死磕 java集合之LinkedList源码分析
问题(1)LinkedList只是一个List吗?(2)LinkedList还有其它什么特性吗?(3)LinkedList为啥经常拿出来跟ArrayList比较?(4)我为什么把LinkedList放在最后一章来讲?简介LinkedList是一个以双向链表实现的List,它除了作为List使用,还可以作为队列或者栈来使用,它是怎么实现的呢?让我们一起来学习吧。继承体系通过继承体系...原创 2019-05-03 09:20:28 · 242 阅读 · 0 评论 -
死磕 java集合之DelayQueue源码分析
问题(1)DelayQueue是阻塞队列吗?(2)DelayQueue的实现方式?(3)DelayQueue主要用于什么场景?简介DelayQueue是java并发包下的延时阻塞队列,常用于实现定时任务。继承体系从继承体系可以看到,DelayQueue实现了BlockingQueue,所以它是一个阻塞队列。另外,DelayQueue还组合了一个叫做Delayed的接口,Delay...原创 2019-04-28 23:33:30 · 208 阅读 · 0 评论 -
死磕 java集合之终结篇
概览我们先来看一看java中所有集合的类关系图。这里面的类太多了,请放大看,如果放大还看不清,请再放大看,如果还是看不清,请放弃。我们下面主要分成五个部分来逐个击破。ListList中的元素是有序的、可重复的,主要实现方式有动态数组和链表。java中提供的List的实现主要有ArrayList、LinkedList、CopyOnWriteArrayList,另外还有两个古老的类Ve...原创 2019-05-04 22:00:14 · 1847 阅读 · 7 评论 -
死磕 java集合之LinkedHashSet源码分析
问题(1)LinkedHashSet的底层使用什么存储元素?(2)LinkedHashSet与HashSet有什么不同?(3)LinkedHashSet是有序的吗?(4)LinkedHashSet支持按元素访问顺序排序吗?简介上一节我们说HashSet中的元素是无序的,那么有没有什么办法保证Set中的元素是有序的呢?答案是当然可以。我们今天的主角LinkedHashSet就有这个功...原创 2019-04-15 21:07:26 · 175 阅读 · 0 评论 -
死磕 java集合之HashMap源码分析
欢迎关注我的公众号“彤哥读源码”,查看更多源码系列文章, 与彤哥一起畅游源码的海洋。简介HashMap采用key/value存储结构,每个key对应唯一的value,查询和修改的速度都很快,能达到O(1)的平均时间复杂度。它是非线程安全的,且不保证元素存储的顺序;继承体系HashMap实现了Cloneable,可以被克隆。HashMap实现了Serializable,可以被序列化。H...原创 2019-03-31 20:30:44 · 464 阅读 · 0 评论 -
死磕 java集合之CopyOnWriteArrayList源码分析
欢迎关注我的公众号“彤哥读源码”,查看更多源码系列文章, 与彤哥一起畅游源码的海洋。简介CopyOnWriteArrayList是ArrayList的线程安全版本,内部也是通过数组实现,每次对数组的修改都完全拷贝一份新的数组来修改,修改完了再替换掉老数组,这样保证了只阻塞写操作,不阻塞读操作,实现读写分离。继承体系CopyOnWriteArrayList实现了List, RandomAc...原创 2019-03-31 15:14:10 · 308 阅读 · 0 评论 -
死磕 java集合之HashSet源码分析
问题(1)集合(Collection)和集合(Set)有什么区别?(2)HashSet怎么保证添加元素不重复?(3)HashSet是否允许null元素?(4)HashSet是有序的吗?(5)HashSet是同步的吗?(6)什么是fail-fast?简介集合,这个概念有点模糊。广义上来讲,java中的集合是指java.util包下面的容器类,包括和Collection及Map相关的...原创 2019-04-14 21:56:56 · 200 阅读 · 0 评论 -
死磕 java集合之ConcurrentSkipListMap源码分析——发现个bug
前情提要点击链接查看“跳表”详细介绍。拜托,面试别再问我跳表了!简介跳表是一个随机化的数据结构,实质就是一种可以进行二分查找的有序链表。跳表在原有的有序链表上面增加了多级索引,通过索引来实现快速查找。跳表不仅能提高搜索性能,同时也可以提高插入和删除操作的性能。存储结构跳表在原有的有序链表上面增加了多级索引,通过索引来实现快速查找。源码分析主要内部类内部类跟存储结构结合着来看...原创 2019-04-14 13:37:53 · 340 阅读 · 0 评论 -
死磕 java集合之ConcurrentHashMap源码分析(三)
本章接着上两章,链接直达:死磕 java集合之ConcurrentHashMap源码分析(一)死磕 java集合之ConcurrentHashMap源码分析(二)删除元素删除元素跟添加元素一样,都是先找到元素所在的桶,然后采用分段锁的思想锁住整个桶,再进行操作。public V remove(Object key) { // 调用替换节点方法 return replac...原创 2019-04-10 23:38:27 · 255 阅读 · 0 评论 -
死磕 java集合之ConcurrentHashMap源码分析(二)——扩容
本章接着上一章,链接直达请点我。初始化桶数组第一次放元素时,初始化桶数组。private final Node<K,V>[] initTable() { Node<K,V>[] tab; int sc; while ((tab = table) == null || tab.length == 0) { if ((sc = sizeC...原创 2019-04-10 18:49:52 · 1606 阅读 · 0 评论 -
死磕 java集合之ConcurrentHashMap源码分析(一)
开篇问题(1)ConcurrentHashMap与HashMap的数据结构是否一样?(2)HashMap在多线程环境下何时会出现并发安全问题?(3)ConcurrentHashMap是怎么解决并发安全问题的?(4)ConcurrentHashMap使用了哪些锁?(5)ConcurrentHashMap的扩容是怎么进行的?(6)ConcurrentHashMap是否是强一致性的?(7)...原创 2019-04-08 23:16:39 · 298 阅读 · 0 评论 -
如何阅读jdk源码?
简介这篇文章主要讲述jdk本身的源码该如何阅读,关于各种框架的源码阅读我们后面再一起探讨。笔者认为阅读源码主要包括下面几个步骤。设定目标凡事皆有目的,阅读源码也是一样。从大的方面来说,我们阅读源码的目的是为了提升自己的技术能力,运用到工作中,遇到问题快速定位,升职加薪等等。从小的方面来说,阅读某一段源码的目的就是要搞清楚它的原理,就是死磕,就是那种探索真相的固执。目的是抽象的,目标是...原创 2019-04-07 22:44:20 · 390 阅读 · 0 评论 -
死磕 java集合之TreeMap源码分析(四)-内含彩蛋
欢迎关注我的公众号“彤哥读源码”,查看更多源码系列文章, 与彤哥一起畅游源码的海洋。二叉树的遍历我们知道二叉查找树的遍历有前序遍历、中序遍历、后序遍历。(1)前序遍历,先遍历我,再遍历我的左子节点,最后遍历我的右子节点;(2)中序遍历,先遍历我的左子节点,再遍历我,最后遍历我的右子节点;(3)后序遍历,先遍历我的左子节点,再遍历我的右子节点,最后遍历我;这里的前中后都是以“我”的顺序...原创 2019-04-04 23:54:54 · 183 阅读 · 0 评论 -
死磕 java集合之TreeMap源码分析(三)- 内含红黑树分析全过程
欢迎关注我的公众号“彤哥读源码”,查看更多源码系列文章, 与彤哥一起畅游源码的海洋。删除元素删除元素本身比较简单,就是采用二叉树的删除规则。(1)如果删除的位置有两个叶子节点,则从其右子树中取最小的元素放到删除的位置,然后把删除位置移到替代元素的位置,进入下一步。(2)如果删除的位置只有一个叶子节点(有可能是经过第一步转换后的删除位置),则把那个叶子节点作为替代元素,放到删除的位置,然后...原创 2019-04-04 23:49:40 · 181 阅读 · 0 评论 -
死磕 java集合之TreeMap源码分析(二)- 内含红黑树分析全过程
欢迎关注我的公众号“彤哥读源码”,查看更多源码系列文章, 与彤哥一起畅游源码的海洋。插入元素插入元素,如果元素在树中存在,则替换value;如果元素不存在,则插入到对应的位置,再平衡树。public V put(K key, V value) { Entry<K,V> t = root; if (t == null) { // 如果没有根节点,直...原创 2019-04-04 22:02:11 · 164 阅读 · 1 评论 -
死磕 java集合之TreeMap源码分析(一)- 内含红黑树分析全过程
欢迎关注我的公众号“彤哥读源码”,查看更多源码系列文章, 与彤哥一起畅游源码的海洋。简介TreeMap使用红黑树存储元素,可以保证元素按key值的大小进行遍历。继承体系TreeMap实现了Map、SortedMap、NavigableMap、Cloneable、Serializable等接口。SortedMap规定了元素可以按key的大小来遍历,它定义了一些返回部分map的方法。pu...原创 2019-04-03 21:21:16 · 311 阅读 · 0 评论 -
死磕 java集合之WeakHashMap源码分析
欢迎关注我的公众号“彤哥读源码”,查看更多源码系列文章, 与彤哥一起畅游源码的海洋。简介WeakHashMap是一种弱引用map,内部的key会存储为弱引用,当jvm gc的时候,如果这些key没有强引用存在的话,会被gc回收掉,下一次当我们操作map的时候会把对应的Entry整个删除掉,基于这种特性,WeakHashMap特别适用于缓存处理。继承体系可见,WeakHashMap没有实现...原创 2019-04-02 23:09:39 · 252 阅读 · 0 评论 -
死磕 java集合之LinkedHashMap源码分析
欢迎关注我的公众号“彤哥读源码”,查看更多源码系列文章, 与彤哥一起畅游源码的海洋。简介LinkedHashMap内部维护了一个双向链表,能保证元素按插入的顺序访问,也能以访问顺序访问,可以用来实现LRU缓存策略。LinkedHashMap可以看成是 LinkedList + HashMap。继承体系LinkedHashMap继承HashMap,拥有HashMap的所有特性,并且额外增...原创 2019-04-01 21:51:21 · 259 阅读 · 0 评论 -
死磕 java集合之ArrayDeque源码分析
问题(1)什么是双端队列?(2)ArrayDeque是怎么实现双端队列的?(3)ArrayDeque是线程安全的吗?(4)ArrayDeque是有界的吗?简介双端队列是一种特殊的队列,它的两端都可以进出元素,故而得名双端队列。ArrayDeque是一种以数组方式实现的双端队列,它是非线程安全的。继承体系通过继承体系可以看,ArrayDeque实现了Deque接口,Deque接口...原创 2019-04-29 23:17:35 · 192 阅读 · 0 评论