VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 编程开发 > 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

 

原文:https://www.cnblogs.com/lionsblog/p/14298974.html


相关教程