HashMap全解析
2019-11-01 09:54:02 0 举报
JDK8,HashMap全解析
作者其他创作
大纲/内容
Next
代码解析(高低位)
... ...
hash();
put()
putVal()
迁移
Node
resize()
static final int hash(Object key) { int h; h = key.hashCode();//第一步取出hacode if(key == null){ return 0; }else{ //h ^ (h >>> 16)第二步让高位参与运算 return h ^ (h >>> 16); } }第三步,在putVal()中,还有hash & (length-1)的取模运算key,真正变成index的过程是是先取hashcode,再进行高位运算,再进行与运算
在进行putVal
这里用到了高低位头尾指针,其实作用就是也就是将原来的一条链表拆成两条链表,低位链表的数据将会到新数组的当前下标位置(原来下标多少,新下标就是多少),高位链表的数据将会到新数组的当前下标+当前数组长度的位置(原来下标多少,新下标就是多少+当前数组长度)。
代码解析
HashMap为了解决哈希冲突采用了拉链法,说白了就是数组加链表,在每个数组(table)元素(Node)都有一个链表,通过哈希计算后,得到需要放到哈希桶数组的下标,把元素放到这个下标对应的节点后的链表里。--------------------------------------------------------------------------------map.put(\"美团\
HashMap中主要的两个方法:put()和resize()
迁移时,我们使用的是2次幂的扩展(指长度扩为原来2倍),这样能够保证元素的新位置要么是在原位置,要么是在原位置再移动2次幂的位置,比如:n:16n-1:15 0000 1111h: 0111 1001 &---------------------------------------结果: 0000 1001 十进制:9扩容:n:32n-1:31 0001 1111h: 0111 1001 &---------------------------------------结果: 0001 1001 十进制:27,如果h为0110 1001,就是没变所以这个位置要么增加了16,要么不变;因此,我们在扩充HashMap的时候,不需要像JDK1.7的实现那样重新计算hash,只需要看看原来的hash值新增的那个bit是1还是0就好了,是0的话索引没变,是1的话索引变成“原索引+oldCap。
整个resize()过程其实可以分为两大步,第一步是扩容,第二步是迁移
详细代码
哈希桶组table(数组),长度16
先经过一次hash
0 条评论
下一页
为你推荐
查看更多