8000 2147483648 -> 2147483647 · coderhxt/JavaGuide@57a525a · GitHub
[go: up one dir, main page]

Skip to content

Commit 57a525a

Browse files
2147483648 -> 2147483647
疑似应该是整型上限
1 parent 3dc5234 commit 57a525a

File tree

1 file changed

+1
-1
lines changed

1 file changed

+1
-1
lines changed

Java相关/这几道Java集合框架面试题几乎必问.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ static int hash(int h) {
178178

179179
## HashMap 的长度为什么是2的幂次方
180180

181-
为了能让 HashMap 存取高效,尽量较少碰撞,也就是要尽量把数据分配均匀。我们上面也讲到了过了,Hash 值的范围值-2147483648到2147483648,前后加起来大概40亿的映射空间,只要哈希函数映射得比较均匀松散,一般应用是很难出现碰撞的。但问题是一个40亿长度的数组,内存是放不下的。所以这个散列值是不能直接拿来用的。用之前还要先做对数组的长度取模运算,得到的余数才能用来要存放的位置也就是对应的数组下标。这个数组下标的计算方法是“ `(n - 1) & hash` ”。(n代表数组长度)。这也就解释了 HashMap 的长度为什么是2的幂次方。
181+
为了 4AD3 能让 HashMap 存取高效,尽量较少碰撞,也就是要尽量把数据分配均匀。我们上面也讲到了过了,Hash 值的范围值-2147483648到2147483647,前后加起来大概40亿的映射空间,只要哈希函数映射得比较均匀松散,一般应用是很难出现碰撞的。但问题是一个40亿长度的数组,内存是放不下的。所以这个散列值是不能直接拿来用的。用之前还要先做对数组的长度取模运算,得到的余数才能用来要存放的位置也就是对应的数组下标。这个数组下标的计算方法是“ `(n - 1) & hash` ”。(n代表数组长度)。这也就解释了 HashMap 的长度为什么是2的幂次方。
182182

183183
**这个算法应该如何设计呢?**
184184

0 commit comments

Comments
 (0)
0