HashMap源码分析(一):JDK源码分析系列 (2)

loadFactor 加载因子,是用来衡量 HashMap 满的程度,计算HashMap的实时加载因子的方法为:size/capacity,而不是占用桶的数量去除以capacity。capacity 是桶的数量,也就是 table 的长度length。

threshold 计算公式:capacity * loadFactor。这个值是当前已占用数组长度的最大值。过这个数目就重新resize(扩容),扩容后的 HashMap 容量是之前容量的两倍

4.构造方法

开始看构造方法。

4.1 HashMap()

构造一个空的 HashMap ,默认初始容量(16)和默认负载因子(0.75)。

HashMap源码分析(一):JDK源码分析系列

4.2 HashMap(int initialCapacity)

构造一个空的 HashMap具有指定的初始容量和默认负载因子(0.75)。

HashMap源码分析(一):JDK源码分析系列

4.3 HashMap(int initialCapacity, float loadFactor)

构造一个空的 HashMap具有指定的初始容量和负载因子。我们来分析一下。

HashMap源码分析(一):JDK源码分析系列

最后调用了tableSizeFor,来看一下方法实现:

HashMap源码分析(一):JDK源码分析系列

5.增加

现在我们开始分析put()方法

HashMap源码分析(一):JDK源码分析系列

我们可以看到put调用的是putVal来进行数据插入,但是要注意到key在这里执行了一下hash()方法,来看一下Hash方法是如何实现的。

HashMap源码分析(一):JDK源码分析系列

从上面可以得知HashMap是支持Key为空的,而HashTable是直接用过Key来获取HashCode所以key为空会抛异常其实上面就已经解释了为什么HashMap的长度为什么要是2的幂因为HashMap 使用的方法很巧妙,它通过 hash & (table.length -1)来得到该对象的保存位,前面说过 HashMap 底层数组的长度总是2的n次方,这是HashMap在速度上的优化。当 length 总是2的n次方时,hash & (length-1)运算等价于对 length 取模,也就是 hash%length,但是&比%具有更高的效率。比如 n % 32 = n & (32 -1)。

现在看putVal()方法,看看它到底做了什么。

主要参数:

hash key的hash值

key 原始Key

value 要存放的值

onlyIfAbsent 如果true代表不更改现有的值

evict 如果为false表示table为创建状态

完整源码分析,放图片的话会太长了,所以就截取了一下分为两部。

HashMap源码分析(一):JDK源码分析系列

HashMap源码分析(一):JDK源码分析系列

暂时分析到添加 ,首发乱敲代码公众号

HashMap源码分析(一):JDK源码分析系列

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zywszx.html