1
0
mirror of https://github.com/Snailclimb/JavaGuide synced 2025-06-20 22:17:09 +08:00

2147483648 -> 2147483647

疑似应该是整型上限
This commit is contained in:
靳阳 2019-01-03 15:25:20 +08:00 committed by GitHub
parent 3dc5234d3a
commit 57a525ad15
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -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的幂次方。
**这个算法应该如何设计呢?**