
集合源码
文章平均质量分 88
FrozenPenguin
冰冻三尺,非一日之寒;水滴石穿,非一日之功。
展开
-
为什么ConcurrentHashMap不允许插入null值而HashMap可以?
在Java中,我们通常使用Map来存储键值对数据,而ConcurrentHashMap作为一个高效的线程安全的Map,其使用在并发场景下非常广泛。但是,ConcurrentHashMap有一个特殊的限制,那就是它不允许key或value为null,这与普通的HashMap有所不同。原创 2023-07-20 16:44:56 · 1086 阅读 · 0 评论 -
图解JDK1.7中HashMap头插法扩容造成的死循环问题
HashMap是线程不安全的,在并发使用HashMap时很容易出现一些问题,其中最典型的就是并发情况下扩容之后会发生死循环,导致CPU占用100%。同时,这也是一个高频面试题。本文通过解读HashMap源码并结合实例,来具体分析HashMap扩容发生的死循环问题。原创 2023-01-08 12:01:42 · 3702 阅读 · 1 评论 -
JDK1.8中HashMap的resize()方法详解
resize()方法的代码比较长,我们先用文字来总结一下该方法具体做了什么。首先记录当前数组信息,当前数组、数组长度还有扩容阈值。接着就到了一个if-elseif-else的代码块,这些就是用来判断当前是进行初始化操作还是扩容操作,如果是扩容操作则需要进行双倍扩容,如果是初始化数组则需要设置数组容量。如果是扩容操作或者初始化的时候用户指定了初始容量,则要⽤新数组的大小重写计算扩容阈值重新生成一个数组(无论是扩容操作还是初始化操作都需要)。原创 2022-12-29 14:25:52 · 1767 阅读 · 0 评论 -
「集合底层」深入浅出HashMap底层源码
HashMap底层采用了哈希表,而哈希表是由数组和链表实现的。数组和链表各有自己的特点:数组:占用空间连续。 寻址容易,查询速度快。但是,增加和删除效率非常低。链表:占用空间不连续。 寻址困难,查询速度慢。但是,增加和删除效率非常高。所以HashMap既有数组的优点也有链表的优点(即查询快,增删效率也高)。原创 2022-12-21 12:56:02 · 1711 阅读 · 0 评论 -
「集合入门」HashMap的七大遍历方式
HashMap 遍历从大的方向来说,可分为以下 4 类:迭代器(Iterator)方式遍历;For Each 方式遍历;Lambda 表达式遍历(JDK 1.8+);Streams API 遍历(JDK 1.8+)。原创 2022-12-20 07:30:00 · 2250 阅读 · 1 评论 -
「集合底层」Vector底层结构及源码剖析
Vector是一个矢量队列,它的继承关系和ArrayList是一样的,同样实现了标记接口,用来表明其支持快速(通常是固定时间)随机访问。此接口的主要目的是允许一般的算法更改其行为,从而在将其应用到随机或连续访问列表时能提供良好的性能。Vector实现了Cloneable标记接口,用来指示方法可以合法地对该类实例按字段复制。如果在没有实现Cloneable接口的实例上调用Object的clone方法,则会导致抛出异常。接口: 类通过实现接口以启用其序列化功能。原创 2022-12-19 12:05:36 · 2461 阅读 · 0 评论 -
「集合底层」ArrayList底层扩容机制及源码分析
ArrayList作为List接口的实现类,它是一种可以根据需要动态增长的数组。在Java中标准的数组都是定长的,当一个数组被创建后,它不能再被修改长度,也就是说我们在创建数组时要确定数组所需的长度。但有时我们需要动态程序中获取数组长度,此时,我们就可以使用ArrayList来存储数据,但是它并不是线程安全的。先说结论ArrayList中维护了一个Object类型的数组elementData.[debug看源码]transienttransient表示瞬间,短暂的,表示该属性不会被序列号。原创 2022-12-13 09:24:27 · 1716 阅读 · 0 评论