前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >解析 hashMap 源码之位运算

解析 hashMap 源码之位运算

作者头像
shengjk1
发布2020-09-09 14:49:21
2920
发布2020-09-09 14:49:21
举报
文章被收录于专栏:码字搬砖码字搬砖
计算索引
代码语言:javascript
复制
tab[i = (n - 1) & hash])

当 n == 2^x 的时候,(n - 1) & hash 与 hash % n 是等价的,但 (n - 1) & hash ( 位运算 )效率更高,因为 % 是通过 加法跟移位 来实现的

计算 hash 值
代码语言:javascript
复制
 // 扰动函数
    // 增加 hash 值的任意性,让高位参与到运算中来
    static final int hash(Object key) {
        int h;
        return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
    }

让高位参与运算,增加 hash 值的随意性

计算 tableSize
代码语言:javascript
复制
/**
     * Returns a power of two size for the given target capacity.
     */
    // 大于等于 cap 的 最小的 2 的幂次方
    static final int tableSizeFor(int cap) {
        int n = cap - 1;
        n |= n >>> 1;
        n |= n >>> 2;
        n |= n >>> 4;
        n |= n >>> 8;
        n |= n >>> 16;
        return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
    }

什么意思呢? 我们假设 cap 分别为 3,127,5,64,*

代码语言:javascript
复制
3    0000 0011
-1   0000 0010
>>>1 0000 0001 
|    0000 0011 
>>>2 0000 0000 
|    0000 0000 
....
结果不变 1

 127   0111 1111 
 -1    0111 1110 
 >>>1  0011 1111 
 |     0111 1111 
 >>>2  0001 1111 
 |     0111 1111 
 ....
 结果不变 128


 5    0000 0101
 -1   0000 0100 
 >>>1 0000 0010 
 |    0000 0110 
 >>>2 0000 0001 
 |    0000 0111 
 >>>3 0000 0000 
 |    0000 0111 
 ....
结果不变 8

//这就是为什么要减一 
64    0100 0000 
-1    0011 1110 
>>>1  0001 1111 
|     0011 1111 
>>>2  0000 1111 
|     0011 1111 
....
结果不变 64


更一般的
     01** ****
-1   01** ****

>>>1 001* ****
|    011* ****
>>>2 0001 1***
|    0111 1***
>>>4 0000 0111 
|    0111 1111 
....
结果不变
      0*** ****
-1    0*** ****
>>>1  00** ****    
|     0*** ****
>>>2  000* ****
|     0*** ****
....
结果不变

其实最终的结果就是返回

大于等于 cap 的 最小的 2 的幂次方 此处一定为 2 的幂次方,与 (n - 1) & hash 相呼应

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-09-07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 计算索引
  • 计算 hash 值
  • 计算 tableSize
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档