面试题 - Java8的HashMap put的流程
2020-03-31 本文已影响0人
天命ming
流程图
HashMap - put 流程图.jpg流程
-
hash(key)
。对key.hashCode
高位与运算 - 如果tab数组为空,进行
resize()
操作 - 计算tab索引位置是否有值;没有值,直接插入;然后
++modCount
和++size
操作。在判断tab.size > threshold
,大于则resize()
;结束 - 判断hash是否相等 && 调用equal()判断key是否相等;相同,则更新原值后调用
afterNodeAccess
;结束 - 不相等,如果是红黑树,则红黑树插入
- 如果是链表,则链表插入;插入后如果长度大于8,链表转化为红黑树
- 插入后,再次判断 key 是否相等;相等,更新原值后调用
afterNodeAccess
;结束 -
不相等,则
++modCount
和++size
操作。在判断tab.size > threshold
,大于则resize()
- 结束
伪代码
if (tab数组为空) {
resize();
}
if (hash值对应索引位置为空) {
链表插入;
} else {
if (key相等) {
// 结束if;
} else if (红黑树) {
红黑树插入;
} else {
链表插入;
长度大于8,转化为红黑树;
}
if (key 相等) {
更新value;
afterNodeAccess();
return oldValue;
}
}
++modCount;
if (++size > threshold) {
resize();
}
afterNodeInsertion();
return null;