HashMap的put方法的执行流程?
时间: 2024-03-04 20:50:39 浏览: 138
当我们调用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,通过Key的hashCode()方法得到一个哈希值(hash),这个哈希值用来确定Key在哈希表中的位置。
2. 然后,根据哈希值计算出Key在数组中的索引位置。如果该位置为空,则直接将Key-Value对插入到该位置,并返回null。如果该位置已经存在其他的元素,即发生了哈希冲突,会执行下一步。
3. 在发生哈希冲突的情况下,会使用链表或红黑树来解决冲突。如果该位置上的元素是链表的头节点或红黑树的根节点,则遍历链表或红黑树,比较Key是否存在。如果存在相同的Key,则更新对应的Value,并返回旧的Value;如果不存在相同的Key,则将新的Key-Value对插入到链表或红黑树的末尾,并返回null。
4. 如果链表长度超过阈值(8)或者红黑树的节点数量超过阈值(64),则会将链表转化为红黑树,或者将红黑树转化为链表,以提高查询和插入的性能。
总结起来,HashMap的put方法会根据Key的哈希值确定Key在数组中的位置,然后根据该位置上的元素进行比较和插入操作,解决哈希冲突的情况下可能会使用链表或红黑树来存储元素。
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操作。
阅读全文