美文网首页
hashMap的底层原理

hashMap的底层原理

作者: 王硕_d62f | 来源:发表于2021-04-06 10:41 被阅读0次

    1、hashmap 计算下标的位置

    1111 1111 1111 1111 1111 0000 1110 1010  -- hashcode值(调用hashcode得到)

    0000 0000 0000 0000 1111 1111 1111 1111  -- 无符号右移16位

    1111 1111 1111 1111 0000 1111 0001 0101  -- ^异或运算 相同取0 不同取1  得到hash值

    假设length=16  length-1=15

    hash&(length-1)

    1111 1111 1111 1111 0000 1111 0001 0101  -- hash值

    0000 0000 0000 0000 0000 0000 0000 1111  -- length-1

    0000 0000 0000 0000 0000 0000 0000 0101  -- 做&运算  下标为5

    2、为什么hashMap的容量是2的n次幂 

    hash%length等于hash&(length-1)的前提是length是2的n次幂。

    hash &(length-1)

    假如容量length=8  length-1=7      假如容量length=7  length-1=6

    0000 0001                                           0000 0001

    0000 0111                                            0000 0110

    0000 0001 --1                                      0000 0000  --0

    0000 0010                                           0000 0010

    0000 0111                                            0000 0110

    0000 0010 --2                                      0000 0010  --2

    0000 0011                                            0000 0011

    0000 0111                                            0000 0110

    0000 0011 --3                                      0000 0010  --2

    0000 0100                                            0000 0100

    0000 0111                                            0000 0111

    0000 0100 --4                                      0000 0100  --4

    3、如果在创建HashMap对象的时候,指定的容量不是2的n次幂,比如10,

    HashMap会通过一系列位移运算和或运算得到一个2的n次幂,这个数字是离我们指定容量最近的数字

    cap=10  为防止cap已经是2的n次幂需要 n=cap-1 =9 

    做或运算 比较的位上只要有一个为1就都为1

    n|=n>>>1

    0000 0000 0000 0000 0000 0000 0000 1001  --9

    0000 0000 0000 0000 0000 0000 0000 0100  --右移1位

    0000 0000 0000 0000 0000 0000 0000 1101  --13

    n|=n>>>2

    0000 0000 0000 0000 0000 0000 0000 1101  --13

    0000 0000 0000 0000 0000 0000 0000 0011  --右移2位

    0000 0000 0000 0000 0000 0000 0000 1111  --15

    n|=n>>>4

    0000 0000 0000 0000 0000 0000 0000 1111  --15

    0000 0000 0000 0000 0000 0000 0000 0000  --右移4位

    0000 0000 0000 0000 0000 0000 0000 1111  --15

    cap =n+1= 16

    4、hashmap的扩容

    n:16    n-1=15

    0000 0000 0000 0000 0000 0000 0001 0000  --16

    0000 0000 0000 0000 0000 0000 0000 1111  --15

    1111 1111 1111 1111 1111 0000 0000 0101  --key1

    1111 1111 1111 1111 1111 0000 0001 0101  --key2

    hash&(length-1)

    0000 0000 0000 0000 0000 0000 0000 0101  --key1的下标  5

    0000 0000 0000 0000 0000 0000 0000 0101  --key2的下标  5

    扩容 n:32 n-1=31

    0000 0000 0000 0000 0000 0000 0010 0000  --32

    0000 0000 0000 0000 0000 0000 0001 1111  --31

    1111 1111 1111 1111 1111 0000 0000 0101  --key1

    1111 1111 1111 1111 1111 0000 0001 0101  --key2

    hash&(length-1)

    0000 0000 0000 0000 0000 0000 0000 0101  --key1的新下标  5

    0000 0000 0000 0000 0000 0000 0001 0101  --key2的新下标  21

    相关文章

      网友评论

          本文标题:hashMap的底层原理

          本文链接:https://www.haomeiwen.com/subject/yilskltx.html