![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
jdk源码
文章平均质量分 78
柒间
这个作者很懒,什么都没留下…
展开
-
JDK7中ConcurrentHashMap源码解析
ConcurrentHashMap数据结构ConcurrentHashMap的数据结构与HashMap基本类似, 区别在于:1、内部在数据写入时加了同步机制(分段锁)保证线程安全,读操作是无锁操作;2、扩容时老数据的转移是并发执行的,这样扩容的效率更高ConcurrentHashMap 线程安全的具体实现方式JDK 1.7ConcurrentHashMap基于ReentrantLock实现分段锁将数据分为一段一段的存储,然后给每一段数据配一把锁,底层数据结构:Segment 数组 + Has原创 2022-04-25 22:32:54 · 899 阅读 · 0 评论 -
JDK7 HashMap源码解析
为什么HashMap中在链表与数组的选择时选择了数组?因为使用链表的话访问查询会比较低(get方法),在ArrayList中可以直接使用下表来获取数据,但是链表需要一个位置一个位置遍历来查询。在HashMap中get和put使用的频率都是非常的高的,所以我们也需要同时去保证他们的效率。JDK 1.8 前 : 数组 + 链表put方法:● 通过 key 的 hashCode 经过 扰动函数(hash()) 处理过后得到 hash 值● 通过 (n - 1) & hash (高效的求余数的办原创 2022-04-23 00:29:11 · 250 阅读 · 0 评论 -
为什么HashMap的数组长度是2的幂
为什么HashMap的长度一定是2的次幂呢? 今天和朋友聊天被问到HashMap的数组长度为什么是2的倍数。说实话挺惭愧的,秋招结束了,还不能完整的给出一个完整的答案。我知道了HashMap的数据结构,也知道了什么是Hash冲突,如果定位到的数组位置不含链表(当前entry的next指向null),那么对于查找,添加等操作很快,仅需一次寻址即可;如果定位到的数组包含链表,对于添加操作,其时间复杂度为O(n),首先遍历链表,存在即覆盖,否则新增;对于查找操作来讲,仍需遍历链表,然后通过key对象的eq原创 2021-11-25 08:52:45 · 2308 阅读 · 0 评论 -
JDK1.7与JDK1.8中HashMap的扩容
基础知识注意Java中散列表用链表数组实现,每个链表被称为桶,想要查找表中对象的位置,就要先计算它的散列码,然后与桶的总数取余数,所得到的结果就是保存这个元素桶的索引。hash:翻译为”散列表“,就是把任意长度的输入,通过散列算法,变成固定长度输出,该输出结果是散列值。这种转换是一种压缩映射,散列表的空间通常小于输入的空间,不同的输入可能会散列成相同的输出,所以不能从散列表来唯一的确定输入值。hash冲突:就是根据key即经过一个函数f(key)得到的结果的作为地址去存放当前的key value原创 2021-10-31 17:31:09 · 1956 阅读 · 0 评论 -
自动装箱与自动拆箱
自动装箱与自动拆箱给我们开发提供了很多的便利,在jdk 1.5中,自动装箱首次被引入。而在jdk 1.5之前,如果你想要定义一个value为100的Integer对象,则需要通过new出来。断点跟踪为了能够了解,自动装箱与自动拆箱的过程,我们打上断点一步步跟踪看看自动装箱的过程。自动装箱接下来抬到了Integer的valueOf(int i)方法,当然我这里设置的数是在==[-128,127]==之中,一会在对范围之外的数据进行跟踪。下一步,紧接着我们继续执行,之后就跳出了该方法于是通原创 2021-07-20 20:28:59 · 113 阅读 · 2 评论 -
Integer源码阅读
对于java自动装箱与自动拆箱我目前只停留在知道使用的层面上,为了能够进一步的对其进行深入的研究,下面从源码开始对其进行分析。分析类最首先的当然是从类的继承实现情况开始。public final class Integer extends Number implements Comparable<Integer> {...}对与这个Integer类,它实现了Comparable接口,继承了Number.Comparatable : 强行对实现它的类的每个实例进行自然排序,该接口的唯原创 2021-07-20 19:23:25 · 154 阅读 · 1 评论