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倍后重排)

 

 

下图为取值过程:

posted @ 2019-06-20 20:32  温碧泉  阅读(158)  评论(0编辑  收藏  举报