From 57a525ad15d8ce3f8846793fe47ba5d778a06566 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=B3=E9=98=B3?= <260893248@qq.com> Date: Thu, 3 Jan 2019 15:25:20 +0800 Subject: [PATCH] 2147483648 -> 2147483647 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 疑似应该是整型上限 --- Java相关/这几道Java集合框架面试题几乎必问.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Java相关/这几道Java集合框架面试题几乎必问.md b/Java相关/这几道Java集合框架面试题几乎必问.md index 728585be..daf65c81 100644 --- a/Java相关/这几道Java集合框架面试题几乎必问.md +++ b/Java相关/这几道Java集合框架面试题几乎必问.md @@ -178,7 +178,7 @@ static int hash(int h) { ## HashMap 的长度为什么是2的幂次方 -为了能让 HashMap 存取高效,尽量较少碰撞,也就是要尽量把数据分配均匀。我们上面也讲到了过了,Hash 值的范围值-2147483648到2147483648,前后加起来大概40亿的映射空间,只要哈希函数映射得比较均匀松散,一般应用是很难出现碰撞的。但问题是一个40亿长度的数组,内存是放不下的。所以这个散列值是不能直接拿来用的。用之前还要先做对数组的长度取模运算,得到的余数才能用来要存放的位置也就是对应的数组下标。这个数组下标的计算方法是“ `(n - 1) & hash` ”。(n代表数组长度)。这也就解释了 HashMap 的长度为什么是2的幂次方。 +为了能让 HashMap 存取高效,尽量较少碰撞,也就是要尽量把数据分配均匀。我们上面也讲到了过了,Hash 值的范围值-2147483648到2147483647,前后加起来大概40亿的映射空间,只要哈希函数映射得比较均匀松散,一般应用是很难出现碰撞的。但问题是一个40亿长度的数组,内存是放不下的。所以这个散列值是不能直接拿来用的。用之前还要先做对数组的长度取模运算,得到的余数才能用来要存放的位置也就是对应的数组下标。这个数组下标的计算方法是“ `(n - 1) & hash` ”。(n代表数组长度)。这也就解释了 HashMap 的长度为什么是2的幂次方。 **这个算法应该如何设计呢?**