1. 计算哈希值
2. 处理哈希值
3.查找链表
4. 检查键的存在性
5. 插入新键值对
6. 检查扩容
总结
put()方法是HashMap中用于插入或更新键值对的基本方法。使用 put()方法时,会执行以下步
骤:
1. 计算哈希值
在调用 put(key, value)方法时,首先会根据给定的 key 计算出哈希值。Java 中使用
hashCode() 方法来计算这个哈希值。
int hash = key.hashCode();
2. 处理哈希值
计算得到的哈希值可能很大,因此会将其转换为数组索引,通常使用取模运算,以适应哈希
表数组的大小。此外,为了减少冲突,还会使用一个特定的位运算来保证哈希值在数组长度范围
内。
int index = (hash & (table.length - 1)); // table 是存储键值对的数组
3.查找链表
在指定的索引处,HashMap 会检查该位置是否已经有其他键值对。如果该位置为空,则直接
插入新的键值对。如果已经存在,则需要通过比较找到适当的位置。
4. 检查键的存在性
如果在该索引处找到了一个非空的节点,HashMap 会遍历链表(如果碰到的是链表),检查
该链表中是否已经存在相同的键。
如果找到了相同的键,HashMap会更新该键对应的值。
if (existingNode.key.equals(key)) {existingNode.value = value; // 更新值
}
5. 插入新键值对
如果键在链表中不存在,则创建一个新的节点并将其添加到链表的末尾。
如果当前索引处没有链表,则直接创建一个新的节点并将其放在该索引处。
Node newNode = new Node(key, value);
bucket.add(newNode); // 将新节点添加到链表中
6. 检查扩容
在插入新的键值对后,HashMap 会检查当前存储的元素数量是否超过了负载因子(default load factor is 0.75)。如果超过了负载因子,HashMap将会进行扩容(resize),通常是将数组的大小扩大为原来的两倍,并重新计算所有键值对的索引,以减小碰撞的概率。
总结
put()方法的大致步骤如下:
1. 计算键的哈希值。
2. 处理哈希值以确定在数组中的索引位置。
3. 检查该索引是否已有键值对。
4. 如果存在相同的键,更新对应的值;如果不存在,插入新的键值对。
5. 检查是否需要扩容。