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

  • 相关阅读:
    win7下new出的内存默认是无执行权限的
    【转】 C++获得系统时间,以及1970年1月1日到现在的毫秒数
    【收藏】获取系统安装软件(vc++源码)
    opencv编译以及测试
    Vim命令合集
    在SSMS中打开DTS Package
    秋日的阳光
    又一位部门同事离职
    不要让你的孩子成为留守儿童,更不让你的父母成为空巢老人
    又将有一位同事离职
  • 原文地址:https://www.cnblogs.com/lionsblog/p/14298974.html
Copyright © 2011-2022 走看看