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
网友评论