Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Coudy Hou
JavaGuide
提交
7f9ba7ec
J
JavaGuide
项目概览
Coudy Hou
/
JavaGuide
与 Fork 源项目一致
从无法访问的项目Fork
通知
5
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
J
JavaGuide
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
7f9ba7ec
编写于
2月 25, 2021
作者:
G
guide
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Update HashMap(JDK1.8)源码+底层数据结构分析.md
上级
39388a4a
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
8 addition
and
6 deletion
+8
-6
docs/java/collection/HashMap(JDK1.8)源码+底层数据结构分析.md
docs/java/collection/HashMap(JDK1.8)源码+底层数据结构分析.md
+8
-6
未找到文件。
docs/java/collection/HashMap(JDK1.8)源码+底层数据结构分析.md
浏览文件 @
7f9ba7ec
...
...
@@ -77,7 +77,7 @@ static int hash(int h) {
相比于之前的版本,JDK1.8 以后在解决哈希冲突时有了较大的变化。
当链表长度大于阈值(默认为 8)时,会首先调用
`treeifyBin()`
方法
,
这个方法会根据 HashMap 数组来决定是否转换为红黑树。只有当数组长度大于或者等于 64 的情况下,才会执行转换红黑树操作,以减少搜索时间。否则,就是只是执行
`resize()`
方法对数组扩容。相关源码这里就不贴了,重点关注
`treeifyBin()`
方法即可!
当链表长度大于阈值(默认为 8)时,会首先调用
`treeifyBin()`
方法
。
这个方法会根据 HashMap 数组来决定是否转换为红黑树。只有当数组长度大于或者等于 64 的情况下,才会执行转换红黑树操作,以减少搜索时间。否则,就是只是执行
`resize()`
方法对数组扩容。相关源码这里就不贴了,重点关注
`treeifyBin()`
方法即可!
![](
https://oscimg.oschina.net/oscnet/up-bba283228693dae74e78da1ef7a9a04c684.png
)
...
...
@@ -265,12 +265,12 @@ HashMap 只提供了 put 用于添加元素,putVal 方法只是给 put 方法
1.
如果定位到的数组位置没有元素 就直接插入。
2.
如果定位到的数组位置有元素就和要插入的 key 比较,如果 key 相同就直接覆盖,如果 key 不相同,就判断 p 是否是一个树节点,如果是就调用
`e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value)`
将元素添加进入。如果不是就遍历链表插入(插入的是链表尾部)。
说明:下图有两个小问题:
![
](
https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-7/put方法.png
)
-
[
issue#608
](
https://github.com/Snailclimb/JavaGuide/issues/608
)
指出:直接覆盖之后应该就会 return,不会有后续操作。参考 JDK8 HashMap.java 658 行。
-
当链表长度大于阈值(默认为 8)并且 HashMap 数组长度超过 64 的时候才会执行链表转红黑树的操作,否则就只是对数组扩容。参考 HashMap 的
`treeifyBin()`
方法
说明:上图有两个小问题:
![
](
https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-7/put方法.png
)
-
直接覆盖之后应该就会 return,不会有后续操作。参考 JDK8 HashMap.java 658 行(
[
issue#608
](
https://github.com/Snailclimb/JavaGuide/issues/608
)
)。
-
当链表长度大于阈值(默认为 8)并且 HashMap 数组长度超过 64 的时候才会执行链表转红黑树的操作,否则就只是对数组扩容。参考 HashMap 的
`treeifyBin()`
方法(
[
issue#1087
](
https://github.com/Snailclimb/JavaGuide/issues/1087
)
)。
```
java
public
V
put
(
K
key
,
V
value
)
{
...
...
@@ -306,7 +306,9 @@ final V putVal(int hash, K key, V value, boolean onlyIfAbsent,
if
((
e
=
p
.
next
)
==
null
)
{
// 在尾部插入新结点
p
.
next
=
newNode
(
hash
,
key
,
value
,
null
);
// 结点数量达到阈值,转化为红黑树
// 结点数量达到阈值(默认为 8 ),执行 treeifyBin 方法
// 这个方法会根据 HashMap 数组来决定是否转换为红黑树。
// 只有当数组长度大于或者等于 64 的情况下,才会执行转换红黑树操作,以减少搜索时间。否则,就是只是对数组扩容。
if
(
binCount
>=
TREEIFY_THRESHOLD
-
1
)
// -1 for 1st
treeifyBin
(
tab
,
hash
);
// 跳出循环
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录