Java集合框架源码
文章平均质量分 90
Java常用容器源码详解 基于JDK1.8
小成同学_
This is your lucky day.
展开
-
WeakHashMap源码解析
WeakHashMap 是一种 弱引用 map,内部的 key 会存储为弱引用,当 jvm gc 的时候,如果这些 key 没有强引用存在的话,会被 gc 回收掉,下一次当我们操作 map 的时候会把对应的 Entry 整个删除掉,基于这种特性,WeakHashMap 特别适用于 缓存 处理。 WeakHashMap 因为 gc 的时候会把没有强引用的 key 回收掉,所以注定了它里面的元素不会太多,因此也就不需要像 HashMap 那样元素多的时候转化为红黑树来处理了。 因此,WeakHashMap 的原创 2022-12-21 11:34:23 · 434 阅读 · 0 评论 -
LinkedHashSet源码解析
上一节我们说 HashSet 中的元素是无序的,那么有没有什么办法保证 Set 中的元素是有序的呢? 答案是当然可以。 我们今天的主角 LinkedHashSet 就有这个功能,它是怎么实现有序的呢?让我们来一起学习吧。 如果你已看过前面关于 HashSet 和 HashMap,一定能够想到本文将要讲解的 LinkedHashSet 和 LinkedHashMap 其实也是一回事,前者仅仅是对后者做了一层包装,也就是说 LinkedHashSet 里面有一个 LinkedHashMap(适配器模式)。原创 2022-12-20 15:00:25 · 409 阅读 · 0 评论 -
LinkedHashMap源码解析
LinkedHashMap 继承于 HashMap,其内部的 Entry 多了两个前驱、后继指针,内部额外维护了一个双向链表,能保证元素按插入的顺序访问,也能以访问顺序访问,可以用来实现 LRU 缓存策略。 LinkedHashMap 实现了 Map 接口,即允许放入 key 为 null 的元素,也允许插入 value 为 null 的元素。 LinkedHashMap 可以看成是 LinkedList + HashMap,从名字上可以看出该容器是 LinkedList 和 HashMap 的混合体,原创 2022-12-19 13:48:21 · 477 阅读 · 0 评论 -
HashTable源码解析
HashTable 是一个古老的(JDK1.0 时就已存在)线程安全的容器,其核心方法都是 synchronized 修饰的。 相反 HashMap 不是线程安全的。 从图中可以对比得出,二者都是源于 Map 接口,都实现了 Cloneable 和 Serializable接口,二者都可以克隆和序列化。 但 HashMap 的父类是 AbstractMap,HashTable父类是 Dictionary。 Dictionary 类是一个已经被废弃的类(见其源码中的注释)。父类被废弃,自然其子类 Has原创 2022-12-18 12:14:16 · 474 阅读 · 0 评论 -
HashSet源码解析
HashSet 是 Set 的一种实现方式,底层主要使用 HashMap 来确保元素不重复。 对于 HashSet 和 HashMap,前者仅仅是对后者做了一层包装,也就是说 HashSet 里面有一个 HashMap(适配器模式)。 HashSet 保证元素不重复的关键就在于这个 add() 方法; 在 HashMap 中如果插入元素的 key 与当前桶位的 key 完全一致,则会认为这是一次替换操作,更新键值对的 value 值; 而对于 HashSet 的实现,添加相同的 key 时,利用是否存原创 2022-12-17 13:40:16 · 571 阅读 · 0 评论 -
HashMap源码解析
jdk1.8之前,由 数组+链表 组成。jdk1.8开始,由 数组+链表+红黑树 组成。HashMap 的默认初始容量为 16(1 左移 4位),默认装载因子为 0.75f,容量总是 2 的 n 次方; HashMap 扩容时每次容量变为原来的两倍; 当桶的数量小于 64 时不会进行树化,只会扩容; 当桶的数量大于 64 且单个桶中元素的数量大于 8 时,进行树化; 当单个桶中元素数量小于 6 时,进行反树化; HashMap 是非线程安全的容器; HashMap 查找添加元素的时间复杂度都为 O(1);原创 2022-12-16 13:36:43 · 748 阅读 · 0 评论 -
Stack源码解析
Stack 是 Vector 的子类,也是一个线程安全的容器(方法上都加了synchronized),从名字上可以看出,其是一个栈结构。 // 继承于Vector public class Stack extends Vector { Stack 这个类实现的非常简单,因为栈的结构本身就非常简单,所以这个类甚至都没有属性。 Java 里有一个叫做 Stack 的类 ,却没有叫做 Queue 的类(它是个接口名字),但是 Stack 继承自 Vector,方法都是同步的,一般不使用。 当需要使原创 2022-12-15 10:43:23 · 202 阅读 · 0 评论 -
Vector源码解析
Vector 是一个古老的 线程安全(内部的核心方法都加了synchronized) 的容器,在 JDK1.0 时就已经存在,到如今已经很少使用。基本结构与 ArrayList 类似,可以认为是线程安全版本的 ArrayList,但因为 Vector 效率低下,所以在多线程下使用的基本都是 CopyOnWriteArrayList,其效率更高。 Vector 实现了 List 接口,是顺序容器,即元素存存放的数据与放进去的顺序相同,允许存入 null 元素。底层通过数组实现。 Vector 继承了 Abs原创 2022-12-14 11:19:55 · 692 阅读 · 0 评论 -
ArrayDeque源码解析
双端队列是一种特殊的队列,它的两端都可以进出元素,故而得名双端队列。ArrayDeque 是一种以数组方式实现的双端队列,它是非线程安全的。由其名字可以看出,其是一个由数组实现的双端队列,对比 LinkedList 是由链表实现的双端队列。(1)ArrayDeque 是采用数组方式实现的双端队列;(2)ArrayDeque 的出队入队是通过头尾指针循环利用数组实现的;(3)ArrayDeque 容量不足时是会扩容的,每次扩容容量增加 1 倍;(4)ArrayDeque 可以直接作为栈使用;原创 2022-12-13 09:55:03 · 493 阅读 · 0 评论 -
LinkedList源码解析
LinkedList 是一个双向链表(内部是 Node 节点)实现的 List,并且还实现了 Deque 接口,它除了作为 List 使用,还可以作为队列或者栈来使用。 这样看来,LinkedList 简直就是个全能冠军。当你需要使用栈或者队列时,可以考虑使用 LinkedList,一方面是因为 Java 官方已经声明不建议使用 Stack 类,更遗憾的是,Java 里根本没有一个叫做 Queue 的类(它是个接口名字)。 关于栈或队列,现在的首选是 ArrayDeque,它有着比 LinkedList原创 2022-12-12 10:39:28 · 464 阅读 · 0 评论 -
CopyOnWriteArrayList源码解析
我们知道 ArrayList 是线程不安全的,其存在一个古老的线程安全的 Vector,但是由于 Vector 效率太低 (方法都加了synchronzed),在 JDK1.5 时 Doug Lea 提供了一个效率较高的线程安全的 CopyOnWriteArrayList,其实现了阻塞写操作而不阻塞读操作,写时拷贝原数组写完替换原数组,实现了读写分离。CopyOnWriteArrayList 实现了 List,RandomAccess,Cloneable,java.io.Serializable 等接口。原创 2022-12-11 13:46:04 · 405 阅读 · 0 评论 -
ArrayList源码解析
简介 ArrayList 是一种以数组实现的 List,与数组相比,它具有动态扩展的能力,因此也可称之为动态数组。 ArrayList 线程不安全,除该类未实现同步外,其余跟 Vector 大致相同。 Java 泛型只是编译器提供的语法糖,所以这里的数组是一个 Object 数组,以便能够容纳任何类型的对象。 ArrayList 实现了 List,RandomAccess,Cloneable,java.io.Serializable 等接口。 ArrayList 实现了 List,提供了基础的添加、删除、原创 2022-12-10 10:41:21 · 563 阅读 · 0 评论 -
手撕 JDK1.8 HashMap源码(下)
手撕 JDK1.8 HashMap源码(下) 手撕源码 1. 核心常量与属性 常量 // table初始容量大小 默认值是16 且容量一定是2的次数 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // table最大长度 2的30次方 static final int MAXIMUM_CAPACITY = 1 << 30; // 负载因子大小 默认值是0.75 当哈希表使用了75%就会扩容 static final fl原创 2022-04-18 14:37:23 · 946 阅读 · 14 评论 -
手撕 JDK1.8 HashMap源码(上)
手撕 JDK1.8 HashMap源码(上) 本文是对于HashMap源码的铺垫 并没有涉及到源码 基础入门 什么是哈希 核心理论:Hash也称散列、哈希,对应的英文都是Hash。基本原理就是把任意长度的输入,通过Hash算法变为固定长度输出。 这个映射的规则就是对应的Hash算法,而原始数据映射后的二进制串就是哈希值。 Hash的特点: 从hash值不可以反向推导出原始的数据 输入数据的微小变化会得到完全不同的hash值,相同的数据会得到相同的值 哈希算法的执行效率要高效,原创 2022-04-17 15:49:45 · 486 阅读 · 2 评论 -
哈希表概述
哈希表—HashMap Map集合的子类,HashMap。 Java中对于HashMap的数据结构,是采用对象数组+链表,在链表长度达到一定长度会转换成红黑二叉树; 讲哈希表之前,我们先来看一下API中的Object.hashCode: 既然这个方法是属于Object类的,那就说明所有的类也都有hashCode()这个方法,所有对象都可以调用这个方法,返回对象的哈希码值。 支持此方法的优点是散列表,例如HashMap中的散列表。 这里的支持此方法,指的是你的编写的子类重写了hashCode()方法,优点原创 2022-04-10 15:26:36 · 1270 阅读 · 2 评论