HashMap的put方法的执行流程?
时间: 2024-03-04 08:50:39 浏览: 119
当我们调用HashMap的put(key, value)方法时,具体的执行流程如下:
1. 首先,将参数key和value封装成一个 Entry 对象。
2. 计算key的hash值,并通过扰动函数(防止hash冲突)将hash值转换为索引值。
3. 判断该索引位置是否已经有元素存在,如果不存在,则将Entry对象直接放入该位置,完成插入操作。
4. 如果该位置已经存在元素,则遍历该位置上的元素,判断是否有key相同的元素。如果有,则用新的value替换旧的value,并返回旧的value。
5. 如果该位置上没有key相同的元素,则将该Entry对象添加到链表末尾。
6. 判断该链表的长度是否达到了阈值(TREEIFY_THRESHOLD),如果达到了则将链表转换为红黑树。
7. 如果插入操作导致了HashMap的size变大了(即添加了一个新元素),则判断是否需要进行扩容操作,如果需要,则进行扩容操作。
总结一下,put方法的执行流程主要包括计算索引值、插入元素、替换元素、链表转红黑树和扩容等操作。
相关问题
HashMap的put的执行流程
HashMap的put方法的执行流程如下:
1. 首先,根据传入的key计算哈希值,通过哈希函数将其转换为一个整数。
2. 使用哈希值和HashMap内部的数组长度进行取模运算,得到一个数组索引,确定key在数组中的位置。
3. 如果该位置为空,即没有发生碰撞,直接将该键值对存储在该位置。
4. 如果该位置已经存在其他键值对,可能发生了碰撞。这时,需要进行链表或红黑树的处理。
- 如果该位置上已经存在链表,遍历链表,找到与当前key相同的节点,更新对应的value。
- 如果该位置上已经存在红黑树,通过红黑树的插入操作将新的键值对添加进红黑树。
- 如果链表长度达到一定阈值(默认为8),将链表转换为红黑树进行存储。
5. 如果插入操作导致HashMap的键值对数量超过了扩容阈值(默认为容量的75%),则进行扩容操作。扩容会重新计算每个键值对在新数组中的位置,并将键值对重新插入新数组中。
总之,HashMap的put方法通过哈希值和数组索引来确定数据存储的位置,处理碰撞的方式可以是链表或红黑树。当达到一定条件时,会触发扩容操作。
hashmap,put、get流程
HashMap是一种基于哈希表实现的Map接口的数据结构,它通过将键映射到值来存储和检索对象,而哈希表则通过散列函数来计算键值对应的哈希码,然后通过哈希码映射到具体的存储位置。
HashMap的put方法流程如下:
1. 首先通过键的hashCode()方法计算键的哈希值。
2. 然后通过哈希值和当前桶数组的长度进行取模运算,得到该键值对应的桶下标。
3. 如果该桶下标对应的链表为空,则直接将该键值对插入到该链表中。
4. 如果该链表不为空,则遍历链表,如果该链表中已经存在该键,则更新该键对应的值;如果该链表中不存在该键,则将该键值对插入到链表的尾部。
5. 如果该链表的长度大于等于TREEIFY_THRESHOLD(默认为8),则将该链表转化为红黑树。
HashMap的get方法流程如下:
1. 首先通过键的hashCode()方法计算键的哈希值。
2. 然后通过哈希值和当前桶数组的长度进行取模运算,得到该键值对应的桶下标。
3. 如果该桶下标对应的链表为空,则返回null。
4. 如果该链表不为空,则遍历链表,如果该链表中存在该键,则返回该键对应的值;如果该链表中不存在该键,则返回null。
5. 如果该链表的长度大于等于TREEIFY_THRESHOLD(默认为8),则在红黑树上执行get操作。
阅读全文