Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Kwan的解忧杂货铺@新空间代码工作室
jdk
提交
ef55d4b7
J
jdk
项目概览
Kwan的解忧杂货铺@新空间代码工作室
/
jdk
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
J
jdk
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
ef55d4b7
编写于
8月 11, 2023
作者:
Kwan的解忧杂货铺@新空间代码工作室
🐭
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix:hashmap的高位和低位
上级
a3ddd083
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
13 addition
and
11 deletion
+13
-11
util/HashMap.java
util/HashMap.java
+13
-11
未找到文件。
util/HashMap.java
浏览文件 @
ef55d4b7
...
...
@@ -706,12 +706,14 @@ public class HashMap<K, V> extends AbstractMap<K, V>
threshold
=
Integer
.
MAX_VALUE
;
return
oldTab
;
}
else
if
((
newCap
=
oldCap
<<
1
)
<
MAXIMUM_CAPACITY
&&
oldCap
>=
DEFAULT_INITIAL_CAPACITY
)
//新cap是旧cap的2倍,并且旧cap大于16
oldCap
>=
DEFAULT_INITIAL_CAPACITY
){
//新cap是旧cap的2倍,并且旧cap大于16
//阈值翻倍
newThr
=
oldThr
<<
1
;
}
else
if
(
oldThr
>
0
)
}
}
else
if
(
oldThr
>
0
)
{
newCap
=
oldThr
;
//旧阈值大于0
else
{
//如果初始化的时候用户什么都没传,那么此时oldCap和oldThr都==0
}
else
{
//如果初始化的时候用户什么都没传,那么此时oldCap和oldThr都==0
//将默认容量大小DEFAULT_INITIAL_CAPACITY(16)赋给newCap(新Node数组的长度)
newCap
=
DEFAULT_INITIAL_CAPACITY
;
//将(默认负载因子)0.75f * (默认的容量大小)DEFAULT_INITIAL_CAPACITY的计算结果,赋值给newThr(新的扩容阀值)
...
...
@@ -742,18 +744,20 @@ public class HashMap<K, V> extends AbstractMap<K, V>
if
(
e
.
next
==
null
)
{
//如果该Node元素的next==null,则说明该Node元素后边既没有链表又没有红黑树
//则将该Node元素直接存于新Node数组的指定位置
newTab
[
e
.
hash
&
(
newCap
-
1
)]
=
e
;
}
else
if
(
e
instanceof
TreeNode
)
{
//如果该Node元素后边跟着的是一个红黑树结构
//在新的Node数组中,将该红黑树进行拆分
//如果拆分后的子树过小(子树的节点小于等于6个),则取消树化,即将其转为链表结构
((
TreeNode
<
K
,
V
>)
e
).
split
(
this
,
newTab
,
j
,
oldCap
);
}
else
{
//新的位置只有两种可能:原位置,原位置+老数组长度
//把原链表拆成两个链表,然后再分别插入到新数组的两个位置上
//不用多次调用put方法
//如果是链表的情况下,则进行下面的链表数据转移的操作
//分别是原位置不变的链表和原位置+原数组长度位置的链表
/**
* 新的位置只有两种可能:原位置,原位置+老数组长度
* 把原链表拆成两个链表,然后再分别插入到新数组的两个位置上
* 不用多次调用put方法
* 如果是链表的情况下,则进行下面的链表数据转移的操作
*/
//分别是原位置不变的链表
Node
<
K
,
V
>
loHead
=
null
,
loTail
=
null
;
//原位置+原数组长度位置的链表
Node
<
K
,
V
>
hiHead
=
null
,
hiTail
=
null
;
Node
<
K
,
V
>
next
;
do
{
...
...
@@ -772,10 +776,8 @@ public class HashMap<K, V> extends AbstractMap<K, V>
loTail
=
e
;
}
else
{
//如果e.hash&oldCap进行与运算,算出的结果不为0,则更新该Node节点所对应的数组下标
if
(
hiTail
==
null
)
{
hiHead
=
e
;
}
else
{
hiTail
.
next
=
e
;
}
hiTail
=
e
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录