![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
集合框架
文章平均质量分 85
mobº
兴趣使然
展开
-
LinkedHashMap 集合源码分析
我们知道 HashMap 并不能保证有序性,而 LinkedHashMap 作为 HashMap 子类解决了排序的问题。在构造时,通过传入afterNodeAccess = true 来设置LinkedHashMap是有序的。通过维护双向来链表来保证有序性,拥有变量 head 和 tail 分别指向双向链表的头结点和尾结点,越靠近 尾结点,越是最近访问的节点,越是靠近头结点,越是越久未被访问的节点。可用于实现 LRU 算法:@Override//最大容量。原创 2024-04-08 22:59:17 · 613 阅读 · 0 评论 -
Hashtable 集合源码分析
Hashtable 使用的哈希表 + 链表来实现的Hashtable 采用的是 数组实现的哈希表 + 链表的结构来实现的。因为在方法上使用了 synchronized 所以是线程安全,但由于是重量级锁,锁的粒度过大,所以效率低下。在进行扩容时,新容量为旧容量的2倍 + 1,当然会检查移除的情况,最大不得超过 Integer.MAX_VALUE - 8。在插入元素和扩容时采用的都是头插法。谈谈和hashmap的区别。原创 2024-04-08 21:13:27 · 1070 阅读 · 0 评论 -
HashMap 集合源码分析
HashMap 底层是使用了 哈希表(数组实现的哈希表)+ 链表 + 红黑树 实现的,所以学习HashMap的源码,如果对这些数据结构比较了解的话,学习的过程中会有些帮助。本文章主要针对 HashMap 的数据结构 TreeNode 设计,添加元素,删除元素,扩容,红黑树转链表,链表转红黑树等方法做了详细的介绍分析。小破栈上的小码哥HashMap讲解HashMap中针对高位与低位的理解。原创 2024-04-02 00:04:38 · 638 阅读 · 0 评论 -
TreeMap 集合源码分析
TreeMap是一个有序的容器,底层是使用了红黑树存储来存储数据,来保证它的有序性,通过红黑树节点的k来进行排序。默认是不支持存储key 为null的,因为 在使用 compare 比较之前会强行转换为 Comparable,所以key 为null 会报错,同时也说明,如果没有传入比较器,那么传入的key 的数据类型得是 Comparable 的实现类。为什么采用红黑树,而不是采用像AVL这种同样是二叉平衡二叉搜索树呢?原创 2024-03-29 23:19:19 · 666 阅读 · 0 评论 -
PriorityQueue集合源码分析
常用于优先级队列,即堆顶元素时优先级最高的/或最低的(看传入的比较器)。不是线程安全的。PriorityQueue 默认是小顶堆,是基于数组实现的完全二叉树来构建的堆。拥有完全二叉树的性质。在初始化时,如果基于其他集合构建的 PriorityQueue,则通过自下而上的下滤操作来进行堆化操作,从而调整成为小顶堆。添加元素时,添加至元素尾部,然后通过上滤进行调整,获取堆顶元素时,通过交换尾元素至堆顶,然后惊醒下滤操作进行调成成小顶堆。原创 2024-03-19 21:48:01 · 538 阅读 · 0 评论 -
ArrayDeque集合源码分析
使用的是可循环使用的双指针数组来存储结构。可以有效的减少扩容次数,并且提高资源利用率。不支持存储null元素。是线程不安全的。可当做链表,栈,队列使用。在头部和尾部插入或者删除元素,时间复杂度为 O(1),但是在扩容的时候需要批量移动元素,其时间复杂度为 O(n)。扩容的时候,将数组长度扩容为原来的 2 倍,即 n原创 2024-03-09 23:07:08 · 304 阅读 · 0 评论 -
LinkedList集合源码分析
LinkedList 使用双向链表来存储元素,不需要连续的内存空间来存储元素,所以不需要扩容。一般作为队列,直接操作头部和尾部。支持存储或删除相同的元素,且支持存储null,存储的元素有序。存在相同多个值是,会删除靠近头结点的值。查找元素只能遍历查找,效率慢O(n),删除,插入快O(1)。根据元素值查找,只能从头结点开始遍历。如果根据 位置查找,会从距离头结点或尾结点近的一方开始遍历。不是线程安全的。原创 2024-03-06 22:50:28 · 463 阅读 · 0 评论 -
ArrayList集合源码分析
ArraList 底层使用数组存储结构,删除或添加元素的效率时间复杂度O(n),效率低下。查找元素快 O(1)。是线程不安全的数据结构,并发场景下可能带来非线程安全的问题。扩容是按1.5来进行扩容,当然不是绝对的,如果扩容后的容量比需要的容量还小,则新容量就是我们需要的容量。比如第一次添加元素时,会判断调用的是那种构造函数,无参第一次扩容为10,有参且为0,扩容后为1。还有就是快要溢出的情况,当需要的容量 > MAX_ARRAY_SIZE,则新容量为Integer.MAA_VALUE。原创 2024-03-03 20:32:27 · 747 阅读 · 1 评论 -
Vector集合源码分析
Vector:是线程安全的集合。因为添加元素和删除元素的方法都有syncnized修饰。因为syncnized是重量级锁且是悲观锁,所以效率并不高。使用数组来存储元素。Vector有两种迭代器,可根据不同场景选择不同的迭代器。通过维护游标curosr和lastRet来维护下一个要访问的元素下标和上一次访问元素下标。Itr迭代器迭代过程不允许集合被修改,通过该迭代器初始化时记录集合的版本号,并在跌单的过程用该版本号和集合的版本号进行比对来判断是否被修改。原创 2024-03-03 20:31:59 · 556 阅读 · 0 评论