1.是什么
在Java中,Map
是一个接口,它存储键值对(key-value pairs)。最常见的Map
实现包括HashMap
、TreeMap
和LinkedHashMap
等。尽管不同的Map
实现可能在内部工作原理上有所不同,但它们都遵循相同的接口规范,包括put
方法。
下面是HashMap
中put
方法的一个详细解释,因为HashMap
是Map
接口最常用的实现之一:
HashMap的put方法
HashMap
基于哈希表实现,使用哈希码来存储和检索元素。它的put
方法的主要步骤如下:
-
计算键的哈希码:
当调用put(K key, V value)
方法时,首先会调用key
对象的hashCode()
方法来计算其哈希码。这个哈希码是一个整数,用于确定元素在哈希表中的位置(桶或索引)。 -
定位桶:
哈希码通过哈希函数(通常是(n - 1) & hash
,其中n
是哈希表的容量)转换为哈希表中的索引,即桶的位置。 -
处理冲突:
如果多个键具有相同的哈希码(哈希冲突),它们会被存储在同一个桶中。HashMap
通过链表(在Java 8及以后,当链表长度超过一定阈值时,转换为红黑树)来解决哈希冲突。 -
存储键值对:
在定位到桶后,HashMap
会检查桶中是否已存在具有相同键的条目:- 如果不存在,则创建一个新的
Node
(或Entry
,在Java 8之前),将键、值和下一个节点的引用(初始为null
)存储起来,并添加到桶中。 - 如果存在,则更新该键对应的值(覆盖旧值)。
- 如果不存在,则创建一个新的
-
调整大小:
在添加元素后,HashMap
会检查其大小是否超过了当前容量与加载因子的乘积(即阈值)。如果超过,则触发扩容操作,创建一个新的哈希表,并将所有元素重新哈希并插入到新的表中。 -
返回值:
put
方法返回该映射中先前与指定键关联的值(如果以前没有与该键关联的值,则返回null
)。这允许检查是否成功替换了旧值。
示例代码
import java.util.HashMap;
import java.util.Map;
public class HashMapExample {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
// 添加键值对
map.put("apple", 1);
map.put("banana", 2);
map.put("orange", 3);
// 更新键值对
Integer oldValue = map.put("banana", 20);
System.out.println("Old value for 'banana': " + oldValue); // 输出: Old value for 'banana': 2
// 遍历Map
for (Map.Entry<String, Integer> entry : map.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
}
}
在这个例子中,我们创建了一个HashMap
,添加了一些键值对,然后更新了其中一个键的值,并最后遍历并打印了所有的键值对。