在JDK 8中,HashMap
的put
方法用于将指定的键与指定的值关联起来(或者更新一个已经存在的键的值)。
put
方法详细说明
-
计算键的哈希值:
- 使用键对象的
hashCode()
方法来计算键的哈希值。
- 使用键对象的
-
定位桶(Bucket):
- 根据哈希值,通过
(n - 1) & hash
操作定位到哈希表中的某个桶(n
是哈希表的大小,通常是一个2的幂次方数)。
- 根据哈希值,通过
-
处理冲突:
- 如果桶中已经存在节点,且节点的键与待插入的键相同(使用
equals
方法判断),则更新该节点的值。 - 如果桶中已经存在节点,但键不同,则判断桶中的节点是链表还是红黑树:
- 如果是链表,则在链表末尾插入新节点,并判断链表长度是否超过8,如果超过则转换为红黑树。
- 如果是红黑树,则按照红黑树的规则插入新节点。
- 如果桶中已经存在节点,且节点的键与待插入的键相同(使用
-
调整哈希表大小:
- 如果哈希表中节点数超过阈值(通常是哈希表大小的0.75倍),则进行扩容操作,将哈希表大小加倍。
-
返回值:
- 返回先前与指定键关联的值(如果存在的话),否则返回
null
。
- 返回先前与指定键关联的值(如果存在的话),否则返回
示例代码 (JDK 8)
import java.util.HashMap;
public class HashMapPutExample {
public static void main(String[] args) {
// 创建一个 HashMap 实例(初始容量为16,加载因子为0.75)
HashMap<String, String> map = new HashMap<>();
// 使用 put 方法插入键值对
map.put("key1", "value1");
map.put("key2", "value2");
map.put("key3", "value3");
// 打印 HashMap
System.out.println("HashMap: " + map);
// 更新一个已存在的键的值
map.put("key2", "newValue2");
// 打印更新后的 HashMap
System.out.println("Updated HashMap: " + map);
// 尝试插入一个已经存在的键,并获取旧值
String oldValue = map.put("key1", "newValue1");
System.out.println("Old value for key 'key1': " + oldValue);
// 打印最终 HashMap
System.out.println("Final HashMap: " + map);
}
}
输出结果
HashMap: {key1=value1, key2=value2, key3=value3}
Updated HashMap: {key1=value1, key2=newValue2, key3=value3}
Old value for key 'key1': value1
Final HashMap: {key1=newValue1, key2=newValue2, key3=value3}
小结
特性/步骤 | 说明 |
---|---|
计算哈希值 | 使用键对象的hashCode() 方法 |
定位桶 | 通过(n - 1) & hash 操作定位到哈希表中的桶 |
处理冲突 | 链表或红黑树处理哈希冲突 |
更新/插入 | 如果键相同则更新值,否则插入新键值对 |
调整哈希表大小 | 节点数超过阈值时扩容 |
返回值 | 返回先前与键关联的值(如果存在),否则返回null |