版权声明:本文为博主原创文章,转载请说明出处 https://blog.csdn.net/u010002184/article/details/89295693
put步骤总结如下:
-
①. 判断键值对数组table[i]是否为空或为null,否则执行resize()进行扩容,初始容量是16;
-
②. 根据键值key计算hash值得到插入的数组索引i,如果table[i]==null,直接新建节点添加,转向⑥,如果table[i]不为空,转向③;
-
③. 判断table[i]的首个元素是否和key一样,如果相同直接覆盖value,否则转向④,这里的相同指的是hashCode以及equals;
-
④. 判断table[i] 是否为TreeNode,即table[i] 是否是红黑树,如果是红黑树,遍历发现该key不存在 则直接在树中插入键值对;遍历发现key已经存在直接覆盖value即可;
-
⑤. 如果table[i] 不是TreeNode则是链表节点,遍历发现该key不存在,则先添加在链表结尾, 判断链表长度是否大于8,大于8的话把链表转换为红黑树;遍历发现key已经存在直接覆盖value即可;
-
⑥. 插入成功后,判断实际存在的键值对数量size是否超多了最大容量threshold,如果超过,进行扩容。
get步骤总结如下:
get()方法就相对简单了,通过hash定位桶,然后根据该桶的存储结构决定是遍历红黑树还是遍历链表。
1 table[i]的首个元素是否和key一样,如果相同则返回该value
2 如果不同,先判断首元素是否是红黑树节点,如果是则去红黑树中查找;反之去链表中查找