zoukankan      html  css  js  c++  java
  • HashMap 位运算原理整理

    hash计算公式: h ^ (h >>> 16)

    h 为 Java native 计算得出的hash值,int类型32位

    假如 h 值如下:

    h dec: 2026691355
    h bin: 01111000110011001101101100011011
    

    h 无符号右移(>>>)16位结果:

    bin: 00000000000000000111100011001100
    dec: 30924
    

    hash异或(^)30924 结果:

    01111000110011001101101100011011
    00000000000000000111100011001100
    --------------------------------
    01111000110011001010001111010111
    

    高16位没变,第16跟高16位异或,最终计算得:

    bin: 01111000110011001010001111010111
    dec: 2026677207
    

    计算数组下角标公式:(n - 1) & hash

    n 为数组长度,假如当前长度为 128

    (128 - 1) & 2026677207
    

    128 - 1 结果:

    dec: 127
    bin: 1111111
    

    与运算:

    00000000000000000000000001111111
    01111000110011001010001111010111
    --------------------------------
    00000000000000000000000001010111
    

    结果:

    dec: 87
    bin: 00000000000000000000000001010111
    

    因为数组长度 n 为 2的幂次方,所以所有 n -1 的二进制值为:低位指数m个1高位补零
    比如上方数组长度为128,为2的7次方。 128-1 为 127 用二进制值表示必定为低位7个1高位补零:
    00000000000000000000000001111111

    而任何数与 00000000000000000000000001111111 进行与运算的计算结果必定在 00000000000000000000000001111111 范围内(因为高位都是0低位都是1与其与运算得出的结果高位仍然还是0),所以计算得出的数组下标必定不会超过数组长度(类似与取模运算)。

    扩容两倍:newCap = oldCap << 1

    左移一位就相当于 oldCap * 2

  • 相关阅读:
    VSCode 配置 Python 开发环境
    出现:Microsoft Visual C++ 14.0 is required 的解决方案
    python3 pathlib库中的Path类的使用
    使用 AI 绘制箭头
    Adobe Illustrator 入门 新建 保存图片
    jinja2
    Java 读取和写入文本文件
    Affy包 estrogen包
    GEOquery
    apply() 函数家族介绍
  • 原文地址:https://www.cnblogs.com/lionsblog/p/14298974.html
Copyright © 2011-2022 走看看