文章目录
put流程
- 如果table为空,调用resize()触发初始化一个容量为16的数组,默认加载因子0.75
- 利用数组长度-1和hash值进行位与运算,计算出一个下标
- 如果该位置没有值,直接将该元素放置在该位置
- 如果该位置有值
- 如果该位置元素的hash值和将要put的元素的hash值相同且该位置元素的key值和将要put的元素的key值相同
- 如果onlyIfAbsent==false或该位置元素的value值为null,直接将新元素value覆盖到当前元素的value
- 如果该位置元素hash值或key与将要put元素的hash值或key不相同,但该位置元素为红黑树TreeNode类型,调用TreeNode.putTreeVal()将新元素插入红黑树
- 如果该位置元素不满足以上所有条件
- 遍历链表,如果没有相同元素,直接将新元素加到链表结尾
- 添加新节点后如果链表长度>8且数组长度<64,调用resize()触发扩容
- 添加新节点后如果链表长度>8且数组长度>64,将链表转为红黑树
- 遍历链表,如果有节点的hash值和key值都与新元素相同,则直接覆盖value
- 遍历链表,如果没有相同元素,直接将新元素加到链表结尾
- 返回该位置元素的原始value
- 如果该位置元素的hash值和将要put的元素的hash值相同且该位置元素的key值和将要put的元素的key值相同
- 结构修改计数+1
- Map.size+1,并且和最大容量(数组长度*加载因子)进行比较,如果size>最大容量,调用resize()触发扩容
- 返回null
本文详细介绍了HashMap中put操作的具体流程,包括初始化、扩容、冲突处理等关键步骤,并解释了链表与红黑树的转换条件。
1003

被折叠的 条评论
为什么被折叠?



