![](https://img-blog.csdnimg.cn/20190918140037908.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
源码解析
源码解析
wangzhipeng47
这个作者很懒,什么都没留下…
展开
-
【死磕 Java 集合】— PriorityQueue源码分析
【死磕 Java 集合】— PriorityQueue源码分析问题(1)什么是优先级队列?(2)怎么实现一个优先级队列?(3)PriorityQueue是线程安全的吗?(4)PriorityQueue就有序的吗?简介优先级队列,是0个或多个元素的集合,集合中的每个元素都有一个权重值,每次出队都弹出优先级最大或最小的元素。一般来说,优先级队列使用堆来实现。还记得堆的相关知识吗?链接直达【拜托,面试别再问我堆(排序)了!】。那么Java里面是如何通过“堆”这个...原创 2020-06-17 18:50:12 · 145 阅读 · 0 评论 -
【死磕 Java 集合】— ConcurrentSkipListSet源码分析
【死磕 Java 集合】— ConcurrentSkipListSet源码分析问题(1)ConcurrentSkipListSet的底层是ConcurrentSkipListMap吗?(2)ConcurrentSkipListSet是线程安全的吗?(3)ConcurrentSkipListSet是有序的吗?(4)ConcurrentSkipListSet和之前讲的Set有何不同?简介ConcurrentSkipListSet底层是通过ConcurrentNavigab...原创 2020-06-17 18:49:24 · 110 阅读 · 0 评论 -
【死磕 Java 集合】— CopyOnWriteArraySet源码分析
【死磕 Java 集合】— CopyOnWriteArraySet源码分析问题(1)CopyOnWriteArraySet是用Map实现的吗?(2)CopyOnWriteArraySet是有序的吗?(3)CopyOnWriteArraySet是并发安全的吗?(4)CopyOnWriteArraySet以何种方式保证元素不重复?(5)如何比较两个Set中的元素是否完全一致?简介CopyOnWriteArraySet底层是使用CopyOnWriteArrayList存...原创 2020-06-17 18:48:42 · 178 阅读 · 0 评论 -
【死磕 Java 集合】— TreeSet源码分析
【死磕 Java 集合】— TreeSet源码分析问题(1)TreeSet真的是使用TreeMap来存储元素的吗?(2)TreeSet是有序的吗?(3)TreeSet和LinkedHashSet有何不同?简介TreeSet底层是采用TreeMap实现的一种Set,所以它是有序的,同样也是非线程安全的。源码分析经过前面我们学习HashSet和LinkedHashSet,基本上已经掌握了Set实现的套路了。所以,也不废话了,直接上源码:package jav...原创 2020-06-17 18:47:59 · 157 阅读 · 0 评论 -
【死磕 Java 集合】— LinkedHashSet源码分析
【死磕 Java 集合】— LinkedHashSet源码分析问题(1)LinkedHashSet的底层使用什么存储元素?(2)LinkedHashSet与HashSet有什么不同?(3)LinkedHashSet是有序的吗?(4)LinkedHashSet支持按元素访问顺序排序吗?简介上一节我们说HashSet中的元素是无序的,那么有没有什么办法保证Set中的元素是有序的呢?答案是当然可以。我们今天的主角LinkedHashSet就有这个功能,它是怎么实现有...原创 2020-06-17 18:47:17 · 121 阅读 · 0 评论 -
【死磕 Java 集合】— HashSet源码分析
【死磕 Java 集合】— HashSet源码分析问题(1)集合(Collection)和集合(Set)有什么区别?(2)HashSet怎么保证添加元素不重复?(3)HashSet是否允许null元素?(4)HashSet是有序的吗?(5)HashSet是同步的吗?(6)什么是fail-fast?简介集合,这个概念有点模糊。广义上来讲,java中的集合是指java.util包下面的容器类,包括和Collection及Map相关的所有类。中义上来讲,我们...原创 2020-06-17 18:46:35 · 127 阅读 · 0 评论 -
【死磕 Java 集合】— ConcurrentSkipListMap源码分析
【死磕 Java 集合】— ConcurrentSkipListMap源码分析前情提要点击链接查看“跳表”详细介绍。拜托,面试别再问我跳表了!简介跳表是一个随机化的数据结构,实质就是一种可以进行二分查找的有序链表。跳表在原有的有序链表上面增加了多级索引,通过索引来实现快速查找。跳表不仅能提高搜索性能,同时也可以提高插入和删除操作的性能。存储结构跳表在原有的有序链表上面增加了多级索引,通过索引来实现快速查找。源码分析主要内部类内部类跟存储结构结合...原创 2020-06-17 18:45:35 · 114 阅读 · 0 评论 -
【死磕 Java 集合】— ConcurrentHashMap源码分析(三)
【死磕 Java 集合】— ConcurrentHashMap源码分析(三)删除元素删除元素跟添加元素一样,都是先找到元素所在的桶,然后采用分段锁的思想锁住整个桶,再进行操作。public V remove(Object key) { // 调用替换节点方法 return replaceNode(key, null, null);}final V replaceNode(Object key, V value, Object cv) { // 计算ha...原创 2020-06-17 18:44:20 · 252 阅读 · 0 评论 -
【死磕 Java 集合】— ConcurrentHashMap源码分析(二)
【死磕 Java 集合】— ConcurrentHashMap源码分析(二)初始化桶数组第一次放元素时,初始化桶数组。private final Node<K,V>[] initTable() { Node<K,V>[] tab; int sc; while ((tab = table) == null || tab.length == 0) { if ((sc = sizeCtl) < 0) /...原创 2020-06-17 18:43:29 · 101 阅读 · 0 评论 -
【死磕 Java 集合】— ConcurrentHashMap源码分析(一)
【死磕 Java 集合】— ConcurrentHashMap源码分析(一)开篇问题(1)ConcurrentHashMap与HashMap的数据结构是否一样?(2)HashMap在多线程环境下何时会出现并发安全问题?(3)ConcurrentHashMap是怎么解决并发安全问题的?(4)ConcurrentHashMap使用了哪些锁?(5)ConcurrentHashMap的扩容是怎么进行的?(6)ConcurrentHashMap是否是强一致性的?(7)Con...原创 2020-06-17 18:42:25 · 103 阅读 · 0 评论 -
【死磕 Java 集合】— TreeMap源码分析(四)
【死磕 Java 集合】— TreeMap源码分析(四)二叉树的遍历我们知道二叉查找树的遍历有前序遍历、中序遍历、后序遍历。(1)前序遍历,先遍历我,再遍历我的左子节点,最后遍历我的右子节点;(2)中序遍历,先遍历我的左子节点,再遍历我,最后遍历我的右子节点;(3)后序遍历,先遍历我的左子节点,再遍历我的右子节点,最后遍历我;这里的前中后都是以“我”的顺序为准的,我在前就是前序遍历,我在中就是中序遍历,我在后就是后序遍历。下面让我们看看经典的中序遍历是怎么实现的:pu...原创 2020-06-14 20:32:04 · 139 阅读 · 0 评论 -
【死磕 Java 集合】— TreeMap源码分析(三)
【死磕 Java 集合】— TreeMap源码分析(三)删除元素删除元素本身比较简单,就是采用二叉树的删除规则。(1)如果删除的位置有两个叶子节点,则从其右子树中取最小的元素放到删除的位置,然后把删除位置移到替代元素的位置,进入下一步。(2)如果删除的位置只有一个叶子节点(有可能是经过第一步转换后的删除位置),则把那个叶子节点作为替代元素,放到删除的位置,然后把这个叶子节点删除。(3)如果删除的位置没有叶子节点,则直接把这个删除位置的元素删除即可。(4)针对红黑树,如果删除位置...原创 2020-06-14 20:31:11 · 149 阅读 · 1 评论 -
【死磕 Java 集合】— TreeMap源码分析(二)
【死磕 Java 集合】— TreeMap源码分析(二)插入元素插入元素,如果元素在树中存在,则替换value;如果元素不存在,则插入到对应的位置,再平衡树。public V put(K key, V value) { Entry<K,V> t = root; if (t == null) { // 如果没有根节点,直接插入到根节点 compare(key, key); // type (and possibly null...原创 2020-06-14 20:28:50 · 122 阅读 · 0 评论 -
【死磕 Java 集合】— TreeMap源码分析(一)
简介TreeMap使用红黑树存储元素,可以保证元素按key值的大小进行遍历。继承体系TreeMap实现了Map、SortedMap、NavigableMap、Cloneable、Serializable等接口。SortedMap规定了元素可以按key的大小来遍历,它定义了一些返回部分map的方法。public interface SortedMap<K,V> extends Map<K,V> { // key的比较器 Compara...原创 2020-06-14 20:27:37 · 231 阅读 · 0 评论 -
【死磕 Java 集合】— WeakHashMap源码分析
简介WeakHashMap是一种弱引用map,内部的key会存储为弱引用,当jvm gc的时候,如果这些key没有强引用存在的话,会被gc回收掉,下一次当我们操作map的时候会把对应的Entry整个删除掉,基于这种特性,WeakHashMap特别适用于缓存处理。继承体系可见,WeakHashMap没有实现Clone和Serializable接口,所以不具有克隆和序列化的特性。存储结构WeakHashMap因为gc的时候会把没有强引用的key回收掉,所以注定了它里面的元素不会太多...原创 2020-06-14 20:25:59 · 142 阅读 · 0 评论 -
【死磕 Java 集合】— CopyOnWriteArrayList源码分析
简介CopyOnWriteArrayList是ArrayList的线程安全版本,内部也是通过数组实现,每次对数组的修改都完全拷贝一份新的数组来修改,修改完了再替换掉老数组,这样保证了只阻塞写操作,不阻塞读操作,实现读写分离。继承体系CopyOnWriteArrayList实现了List, RandomAccess, Cloneable, java.io.Serializable等接口。CopyOnWriteArrayList实现了List,提供了基础的添加、删除、遍历等操作。C...原创 2020-06-14 20:24:42 · 132 阅读 · 0 评论 -
【死磕 Java 集合】— LinkedHashMap源码分析
简介LinkedHashMap内部维护了一个双向链表,能保证元素按插入的顺序访问,也能以访问顺序访问,可以用来实现LRU缓存策略。LinkedHashMap可以看成是 LinkedList + HashMap。继承体系LinkedHashMap继承HashMap,拥有HashMap的所有特性,并且额外增加的按一定顺序访问的特性。存储结构我们知道HashMap使用(数组 + 单链表 + 红黑树)的存储结构,那LinkedHashMap是怎么存储的呢?通过上面的继承体系...原创 2020-06-14 20:22:07 · 157 阅读 · 0 评论 -
【死磕 Java 集合】— HashMap源码分析
简介HashMap采用key/value存储结构,每个key对应唯一的value,查询和修改的速度都很快,能达到O(1)的平均时间复杂度。它是非线程安全的,且不保证元素存储的顺序;继承体系HashMap实现了Cloneable,可以被克隆。HashMap实现了Serializable,可以被序列化。HashMap继承自AbstractMap,实现了Map接口,具有Map的所有功能。存储结构在Java中,HashMap的实现采用了(数组 + 链表 + 红黑树)的复杂结...原创 2020-06-14 20:21:06 · 214 阅读 · 0 评论 -
【死磕 Java 集合】— LinkedList源码分析
问题(1)LinkedList只是一个List吗?(2)LinkedList还有其它什么特性吗?(3)LinkedList为啥经常拿出来跟ArrayList比较?(4)我为什么把LinkedList放在最后一章来讲?简介LinkedList是一个以双向链表实现的List,它除了作为List使用,还可以作为队列或者栈来使用,它是怎么实现的呢?让我们一起来学习吧。继承体系通过继承体系,我们可以看到LinkedList不仅实现了List接口,还实现了Queue和Deque...原创 2020-06-14 20:20:01 · 97 阅读 · 0 评论 -
【死磕 Java 集合】— ArrayList源码分析
【死磕 Java 集合】— ArrayList源码分析简介ArrayList是一种以数组实现的List,与数组相比,它具有动态扩展的能力,因此也可称之为动态数组。继承体系ArrayList实现了List, RandomAccess, Cloneable, java.io.Serializable等接口。ArrayList实现了List,提供了基础的添加、删除、遍历等操作。ArrayList实现了RandomAccess,提供了随机访问的能力。ArrayList实现...原创 2020-06-14 20:18:45 · 121 阅读 · 0 评论