HashMap底层原理
jdk1.8之前,HashMap底层基于数组和链表。
jdk1.8,HashMap底层基于数组+链表+二叉树(红黑树)。
先创建数组
Node[ ] table = new Node[16] (散列桶初始haul)
再创建链表对象
tableclass Node{
hash; //hash值
key; //键
value; //值
node next; //用于指向链表的下一层(产生冲突,用拉链法)
}
以下是具体的put过程(JDK1.8版)
1、对Key求Hash值,然后再计算下标
2、如果没有碰撞,直接放入桶中(碰撞的意思是计算得到的Hash值相同,需要放到同一个bucket中)
3、如果碰撞了,以链表的方式链接到后面(此处碰撞个人理解为hash值相同,key值不同)
4、如果链表长度超过阀值( TREEIFY THRESHOLD==8),就把链表转成红黑树,链表长度低于6,就把红黑树转回链表
5、如果节点已经存在就替换旧值
6、如果桶满了(容量16*加载因子0.75),就需要 resize(扩容2倍后重排)
下图为取值过程: