HashMap jdk1.8 put get 操作步骤

版权声明:本文为博主原创文章,转载请说明出处 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 如果不同,先判断首元素是否是红黑树节点,如果是则去红黑树中查找;反之去链表中查找

写的特别详细易懂:https://itimetraveler.github.io/2017/11/25/%E3%80%90Java%E3%80%91HashMap%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90%EF%BC%88JDK1.8%EF%BC%89/#%E6%A0%91%E5%BD%A2%E5%8C%96%E6%96%B9%E6%B3%95treeifyBin   

猜你喜欢

转载自blog.csdn.net/u010002184/article/details/89295693