From 2cfca91e09da045e670aa385133e220c8f1df231 Mon Sep 17 00:00:00 2001 From: Snailclimb Date: Thu, 6 Sep 2018 08:33:06 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20JDK1.8=20=E4=B9=8B?= =?UTF-8?q?=E5=89=8D=E7=9A=84=20HashMap=20=E5=BA=95=E5=B1=82=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E7=BB=93=E6=9E=84=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Java相关/HashMap.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Java相关/HashMap.md b/Java相关/HashMap.md index 1803f8f7..107e2f8b 100644 --- a/Java相关/HashMap.md +++ b/Java相关/HashMap.md @@ -22,7 +22,7 @@ JDK1.8 之前 HashMap 由 数组+链表 组成的,数组是 HashMap 的主体 ## 底层数据结构分析 ### JDK1.8之前 -JDK1.8 之前 HashMap 底层是 **数组和链表** 结合在一起使用也就是 **链表散列**。**HashMap 通过 key 的 hashCode 经过扰动函数处理过后得到 hash 值,当 hash 值相同时,通过拉链法解决冲突。** +JDK1.8 之前 HashMap 底层是 **数组和链表** 结合在一起使用也就是 **链表散列**。**HashMap 通过 key 的 hashCode 经过扰动函数处理过后得到 hash 值,然后通过 `(n - 1) & hash` 判断当前元素存放的位置(这里的 n 指的时数组的长度),如果当前位置存在元素的话,就判断该元素与要存入的元素的 hash 值以及 key 是否相同,如果相同的话,直接覆盖,不相同就通过拉链法解决冲突。** **所谓扰动函数指的就是 HashMap 的 hash 方法。使用 hash 方法也就是扰动函数是为了防止一些实现比较差的 hashCode() 方法 换句话说使用扰动函数之后可以减少碰撞。**