![](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 · 156 阅读 · 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 · 120 阅读 · 0 评论