HashMap的初始化,put流程,get流程,扩容流程说明?
时间: 2024-04-15 09:25:28 浏览: 101
HashMap的初始化:
1. 创建一个初始容量为16的数组,用于存储键值对。
2. 设置一个加载因子(默认为0.75),用于控制数组扩容的阈值。
3. 初始化HashMap的大小为0。
put流程:
1. 根据传入的键值对,计算键的哈希值。
2. 根据哈希值计算出在数组中的存储位置(通过哈希值与数组长度-1进行位运算)。
3. 如果该位置为空,则直接将键值对存储在该位置。
4. 如果该位置已经存在其他键值对,则进行链表操作或红黑树操作(从JDK1.8开始,当链表长度超过8时,会转换为红黑树)。
a. 如果存在相同的键,则更新对应的值。
b. 如果不存在相同的键,则将新的键值对添加到链表或红黑树中。
5. 如果链表或红黑树长度超过阈值(8或6),则进行树化操作。
get流程:
1. 根据传入的键,计算键的哈希值。
2. 根据哈希值计算出在数组中的存储位置。
3. 如果该位置为空,则返回null,表示未找到对应的值。
4. 如果该位置存在键值对,则遍历链表或红黑树,找到对应的键值对。
a. 如果存在相同的键,则返回对应的值。
b. 如果不存在相同的键,则返回null,表示未找到对应的值。
扩容流程:
1. 当HashMap中的键值对数量达到数组长度与加载因子的乘积时,即达到阈值,触发扩容操作。
2. 创建一个新的两倍大小的数组,并将旧数组中的键值对重新分配到新数组中。
3. 重新计算键的哈希值,并计算在新数组中的存储位置。
4. 如果该位置为空,则直接将键值对存储在该位置。
5. 如果该位置已经存在其他键值对,则进行链表操作或红黑树操作。
a. 如果存在相同的键,则更新对应的值。
b. 如果不存在相同的键,则将新的键值对添加到链表或红黑树中。
阅读全文