loadFactor 加载因子,是用来衡量 HashMap 满的程度,计算HashMap的实时加载因子的方法为:size/capacity,而不是占用桶的数量去除以capacity。capacity 是桶的数量,也就是 table 的长度length。
threshold 计算公式:capacity * loadFactor。这个值是当前已占用数组长度的最大值。过这个数目就重新resize(扩容),扩容后的 HashMap 容量是之前容量的两倍
4.构造方法开始看构造方法。
4.1 HashMap()构造一个空的 HashMap ,默认初始容量(16)和默认负载因子(0.75)。
4.2 HashMap(int initialCapacity)构造一个空的 HashMap具有指定的初始容量和默认负载因子(0.75)。
4.3 HashMap(int initialCapacity, float loadFactor)构造一个空的 HashMap具有指定的初始容量和负载因子。我们来分析一下。
最后调用了tableSizeFor,来看一下方法实现:
5.增加现在我们开始分析put()方法
我们可以看到put调用的是putVal来进行数据插入,但是要注意到key在这里执行了一下hash()方法,来看一下Hash方法是如何实现的。
从上面可以得知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为创建状态
完整源码分析,放图片的话会太长了,所以就截取了一下分为两部。
暂时分析到添加 ,首发乱敲代码公众号