集合
文章平均质量分 82
集合
二狗家有矿
这个作者很懒,什么都没留下…
展开
-
目前最详细的红黑树原理分析(大量图片+过程推导!!!)
一.为什么要有红黑树这种数据结构? 我们知道ALV树是一种严格按照定义来实现的平衡二叉查找树,所以它查找的效率非常稳定,为O(log n),由于其严格按照左右子树高度差不大于1的规则,插入和删除操作中需要大量且复杂的操作来保持ALV树的平衡(左旋和右旋),因此ALV树适用于大量查询,少量插入和删除的场景中那么假设现在假设有这样一种场景:大量查询,大量插入和删除,现在使用ALV树就不太合适了,因为ALV树大量的插入和删除会非常耗时间,那么我们是否可以降低ALV树对平衡性的要求从而达到快速的插入和...转载 2021-03-09 23:29:18 · 1442 阅读 · 0 评论 -
【Java容器源码】源码层面分析集合类在JDK8和JDK7中的差异
1.List区别1.1 ArrayList(改动小)ArrayList 无参初始化时,Java 7 是直接初始化 10 的大小,Java 8 去掉了这个逻辑,初始化时是空数组,在第一次 add 时才开始按照 10 进行扩容,下图是源码的差异对比图:List 其它方面 java7 和 8 并没有改动。2.Map区别2.1 HashMap(改动大)1)和 ArrayList 一样,Java 8 中 HashMap 在无参构造器中,丢弃了 Java 7 中直接把数组初始化 16 的做法...转载 2021-03-09 10:21:42 · 149 阅读 · 0 评论 -
【Java容器源码】TreeSet 源码分析
TreeSet 大致的结构和 HashSet 相似,具体可以看上篇HashSet源码分析,这里底层组合的是 TreeMap,所以继承了 TreeMap key 能够排序的功能,迭代的时候,也可以按照 key 的排序顺序进行迭代。本篇就主要来看 TreeSet 复用 TreeMap 时同时使用的两种复用思路:TreeSet 直接使用 TreeMap 的某些功能,自己包装成新的 api TreeSet 定义自己想要的 api,自己定义接口规范,让 TreeMap 去实现1.复用 TreeMap 思路转载 2021-03-09 10:19:58 · 102 阅读 · 0 评论 -
【Java容器源码】HashSet 源码分析
看源码先看类注释上,我们可以得到的信息有:底层实现基于 HashMap,所以迭代时不能保证按照插入顺序,或者其它顺序进行迭代; add、remove、contanins、size 等方法的耗时性能,是不会随着数据量的增加而增加的,这个主要跟 HashMap 底层的数组数据结构有关,不管数据量多大,不考虑 hash 冲突的情况下,时间复杂度都是 O (1); 线程不安全的,如果需要安全请自行加锁,或者使用 Collections.synchronizedSet; 迭代过程中,如果数据结构被改变,会快转载 2021-03-09 10:18:50 · 76 阅读 · 0 评论 -
【Java容器源码】TreeMap 源码分析
TreeMap 底层的数据结构就是红黑树,和 HashMap 的红黑树结构一样。不同的是,TreeMap 利用了红黑树左节点小,右节点大的性质,根据 key 进行排序,使每个元素能够插入到红黑树大小适当的位置,维护了 key 的大小关系,适用于 key 需要排序的场景。因为底层使用的是平衡红黑树的结构,所以 containsKey、get、put、remove 等方法的时间复杂度都是 log(n)。TreeMap 继承关系,核心成员变量,主要构造函数:public class TreeMa转载 2021-03-09 09:51:50 · 65 阅读 · 0 评论 -
【Java容器源码】LinkedHashMap 基于链表的迭代器源码分析
前篇:【Java容器源码】LinkedHashMap 实现 LRU 策略源码分析在上一篇文章,我们说了,LinkedHashMap 继承自 HashMap,而 HashMap 提供了基于逐桶遍历策略的 KeyIterator、ValueIterator、EntryIterator,来分别对 key、value、entry 进行迭代(可以参考这篇文章)。而 LinkedHashMap 除了哈希表之外,还有一条贯穿了所有结点双向链表,所以,它重写了获取迭代器的三个方法,返回基于链表遍历策略的迭...转载 2021-03-08 09:18:11 · 151 阅读 · 0 评论 -
【Java容器源码】LinkedHashMap 实现 LRU 策略源码分析
HashMap 是无序的,TreeMap 可以按照 key 进行排序,那有木有 Map 是可以维护插入的顺序的呢?接下来我们一起来看下 LinkedHashMap。LinkedHashMap 本身是继承 HashMap 的,所以它拥有 HashMap 的所有特性,再此基础上,还提供了两大特性:按照插入顺序进行访问; 实现了访问最少最先删除功能,其目的是把很久都没有访问的 key 自动删除。LinkedHashMap 继承关系,核心成员变量,主要构造函数:// LinkedHashMap继承转载 2021-03-08 09:15:58 · 217 阅读 · 0 评论 -
【Java容器源码】LinkedList 源码分析
先来看 LinkedList 的结构,即继承关系,核心成员变量,主要构造函数: public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable { // Node,双向链表 private sta转载 2021-03-08 09:13:31 · 74 阅读 · 0 评论 -
【Java容器源码】关于 ArrayList 的几个问题
1.说说对 ArrayList 的理解?ArrayList 内容很多,可以先从总体架构入手,然后再以某个细节作为突破口,比如这样:ArrayList 底层数据结构是个数组,其 API 都做了一层对数组底层访问的封装,比如说 add 方法的过程是……(这里具体可以参考ArrayList 源码分析中 add 的过程)。另外,对 LinkedList 的理解也是同样套路。2.扩容相关问题1.ArrayList 无参数构造器构造,现在 add 一个值进去,此时数组的大小是多少,下一次扩容前最...转载 2021-03-08 09:10:41 · 195 阅读 · 0 评论 -
【Java容器源码】ArrayList 源码分析
先来看 ArrayList 结构,即继承关系,核心成员变量,主要构造函数:public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable{ // 默认数组大小10 private static final int DEFAULT_CAPACITY = 1转载 2021-03-08 09:09:21 · 73 阅读 · 0 评论 -
【Java源码系列】Long 源码分析 --包装类的缓存池原理
本文以 Long 源码为例,来看看包装类中缓存池设计的思路。1.结构Long 中缓存池相关代码:public final class Long extends Number implements Comparable<Long> { // 用来保存具体long值 private final long value; // 在构造时传入要封装的long值 public Long(long value) { this.value转载 2021-03-08 09:06:17 · 221 阅读 · 0 评论 -
【Java源码系列】String 与 StringBuilder 实现对比
本篇我们就来看看 StringBuilder…StringBuilder原理?为什么拼接效率高于String?StringBuilder的方法实质上是调用父类AbstractStringBuilder的abstract class AbstractStringBuilder implements Appendable, CharSequence { // 实质上也是char[],但他不是final的==>也就是说,在数组空间够大的情况下,一个数组可以存多个字符串转载 2021-03-08 09:04:54 · 84 阅读 · 0 评论 -
【Java源码系列】String 常用 API 源码分析
在上一篇文章我们从源码分析了 String 的底层结构,本篇我们就来看看 String 的有哪些常用方法,及这些方法的底层实现。1. equals(比较)public boolean equals(Object anObject) { // 1.判断内存地址是否相同 if (this == anObject) { return true; } // 2.待比较的对象是否是 String,如果不是 String,转载 2021-03-08 09:03:28 · 96 阅读 · 0 评论 -
【Java源码系列】String 底层结构分析
String 继承关系,核心成员变量,主要构造函数:public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** * 1.final会被jvm缓存,提高了性能 * 2.fianl变量线程安全,节省了线程同步的开销 * 正因为是final的,所有不可变,即所有String都是新的 * 注:这个数组是不可变的,不存转载 2021-03-08 09:00:26 · 680 阅读 · 0 评论 -
【Java容器源码】关于 HashMap 的几个问题
HashMap 系列:【Java容器源码】HashMap(一)底层结构分析 【Java容器源码】HashMap(二)添加元素及树化源码分析 【Java容器源码】HashMap(三)扩容源码分析 【Java容器源码】HashMap(四)获取 value 及迭代器源码分析 【Java容器源码】HashMap(五)源码分析&死锁问题(JDK7) 【Java容器源码】关于HashMap的几个问题1.HashMap 底层数据结构是什么?答:HashMap 底层是数组 + 链表 ...转载 2021-03-07 00:22:10 · 107 阅读 · 0 评论 -
【Java容器源码】HashMap(五)源码分析&死锁问题(JDK7)
HashMap 系列:【Java容器源码】HashMap(一)底层结构分析 【Java容器源码】HashMap(二)添加元素及树化源码分析 【Java容器源码】HashMap(三)扩容源码分析 【Java容器源码】HashMap(四)获取 value 及迭代器源码分析 【Java容器源码】HashMap(五)源码分析&死锁问题(JDK7) 【Java容器源码】关于HashMap的几个问题之前的文章分析了 JDK8 中 HashMap 的结构和主要方法,这节就对比一下 JD...转载 2021-03-07 00:20:59 · 143 阅读 · 0 评论 -
【Java容器源码】HashMap(四)获取 value 及迭代器源码分析
HashMap 系列:【Java容器源码】HashMap(一)底层结构分析 【Java容器源码】HashMap(二)添加元素及树化源码分析 【Java容器源码】HashMap(三)扩容源码分析 【Java容器源码】HashMap(四)获取 value 及迭代器源码分析 【Java容器源码】HashMap(五)源码分析&死锁问题(JDK7) 【Java容器源码】关于HashMap的几个问题1.从Hash表中获取元素get()计算hash,并调用getNode ...转载 2021-03-07 00:19:10 · 325 阅读 · 1 评论 -
【Java容器源码】HashMap(三)扩容源码分析
HashMap 系列:【Java容器源码】HashMap(一)底层结构分析 【Java容器源码】HashMap(二)添加元素及树化源码分析 【Java容器源码】HashMap(三)扩容源码分析 【Java容器源码】HashMap(四)获取 value 及迭代器源码分析 【Java容器源码】HashMap(五)源码分析&死锁问题(JDK7) 【Java容器源码】关于HashMap的几个问题resize() 有两个模式,1.初始化数组,2.扩容。整体氛围两大步骤:1)...转载 2021-03-07 00:17:09 · 189 阅读 · 0 评论 -
【Java容器源码】HashMap(二)添加元素及树化源码分析
HashMap 系列:【Java容器源码】HashMap(一)底层结构分析 【Java容器源码】HashMap(二)添加元素及树化源码分析 【Java容器源码】HashMap(三)扩容源码分析 【Java容器源码】HashMap(四)获取 value 及迭代器源码分析 【Java容器源码】HashMap(五)源码分析&死锁问题(JDK7) 【Java容器源码】关于HashMap的几个问题1.向 Hash 表中添加元素put() public V put(K ke...转载 2021-03-07 00:15:56 · 172 阅读 · 0 评论 -
【Java容器源码】HashMap(一)底层结构分析
HashMap 系列:【Java容器源码】HashMap(一)底层结构分析 【Java容器源码】HashMap(二)添加元素及树化源码分析 【Java容器源码】HashMap(三)扩容源码分析 【Java容器源码】HashMap(四)获取 value 及迭代器源码分析 【Java容器源码】HashMap(五)源码分析&死锁问题(JDK7) 【Java容器源码】关于HashMap的几个问题从 HashMap 的类注释中,我们可以得到如下信息:允许 null 值,不同于 ...转载 2021-03-07 00:14:01 · 93 阅读 · 0 评论