@@ -236,10 +236,10 @@ public HashMap(int initialCapacity, float loadFactor) {
236236}
237237```
238238
239- - 阀值 ` threshold ` ,通过方法` tableSizeFor ` 进行计算,是根据初始化来计算的。
239+ - 阈值 ` threshold ` ,通过方法` tableSizeFor ` 进行计算,是根据初始化来计算的。
240240- 这个方法也就是要寻找比初始值大的,最小的那个2进制数值。比如传了17,我应该找到的是32。
241241
242- 计算阀值大小的方法 ;
242+ 计算阈值大小的方法 ;
243243
244244``` java
245245static final int tableSizeFor(int cap) {
@@ -256,9 +256,9 @@ static final int tableSizeFor(int cap) {
256256- MAXIMUM_CAPACITY = 1 << 30,这个是临界范围,也就是最大的Map集合。
257257- 乍一看可能有点晕😵怎么都在向右移位1、2、4、8、16,这主要是为了把二进制的各个位置都填上1,当二进制的各个位置都是1以后,就是一个标准的2的倍数减1了,最后把结果加1再返回即可。
258258
259- 那这里我们把17这样一个初始化计算阀值的过程 ,用图展示出来,方便理解;
259+ 那这里我们把17这样一个初始化计算阈值的过程 ,用图展示出来,方便理解;
260260
261- ![ bugstack.cn 计算阀值 ] ( https://bugstack.cn/assets/images/2020/interview/interview-4-05.png )
261+ ![ bugstack.cn 计算阈值 ] ( https://bugstack.cn/assets/images/2020/interview/interview-4-05.png )
262262
263263#### 3.2 负载因子
264264
@@ -268,17 +268,17 @@ static final float DEFAULT_LOAD_FACTOR = 0.75f;
268268
269269** 负载因子是做什么的?**
270270
271- 负载因子,可以理解成一辆车可承重重量超过某个阀值时 ,把货放到新的车上。
271+ 负载因子,可以理解成一辆车可承重重量超过某个阈值时 ,把货放到新的车上。
272272
273273那么在HashMap中,负载因子决定了数据量多少了以后进行扩容。* 这里要提到上面做的HashMap例子,我们准备了7个元素,但是最后还有3个位置空余,2个位置存放了2个元素。* 所以可能即使你数据比数组容量大时也是不一定能正正好好的把数组占满的,而是在某些小标位置出现了大量的碰撞,只能在同一个位置用链表存放,那么这样就失去了Map数组的性能。
274274
275- 所以,要选择一个合理的大小下进行扩容,默认值0.75就是说当阀值容量占了3 /4时赶紧扩容,减少Hash碰撞。
275+ 所以,要选择一个合理的大小下进行扩容,默认值0.75就是说当阈值容量占了3 /4时赶紧扩容,减少Hash碰撞。
276276
277277同时0.75是一个默认构造值,在创建HashMap也可以调整,比如你希望用更多的空间换取时间,可以把负载因子调的更小一些,减少碰撞。
278278
279279### 4. 扩容元素拆分
280280
281- 为什么扩容,因为数组长度不足了。那扩容最直接的问题,就是需要把元素拆分到新的数组中。拆分元素的过程中,原jdk1.7中会需要重新计算哈希值,但是到jdk1.8中已经进行优化,不在需要重新计算 ,提升了拆分的性能,设计的还是非常巧妙的。
281+ 为什么扩容,因为数组长度不足了。那扩容最直接的问题,就是需要把元素拆分到新的数组中。拆分元素的过程中,原jdk1.7中会需要重新计算哈希值,但是到jdk1.8中已经进行优化,不再需要重新计算 ,提升了拆分的性能,设计的还是非常巧妙的。
282282
283283#### 4.1 测试数据
284284
0 commit comments