精通 Java HashMap:操作、示例与最佳实践
精通 Java HashMap
探索 Java HashMap 类的核心特性、常用操作与实战示例,助你在实际应用中自信使用。
HashMap 类属于 Java 集合框架,实现哈希表,以 键值 对存储数据。每个键唯一,作为其关联值的标识符。该类实现 Map 接口,提供丰富的数据操作 API。

创建 HashMap
先导入 java.util.HashMap 包:
import java.util.HashMap;
再实例化 Map。可指定泛型键类型 K 和值类型 V,或依赖类型推断:
HashMap<K, V> numbers = new HashMap<>();
具体类型示例:
HashMap<String, Integer> numbers = new HashMap<>();
示例 1:基础 HashMap 创建
import java.util.HashMap;
class Main {
public static void main(String[] args) {
HashMap<String, Integer> languages = new HashMap<>();
languages.put("Java", 8);
languages.put("JavaScript", 1);
languages.put("Python", 3);
System.out.println("HashMap: " + languages);
}
}
输出
HashMap: {Java=8, JavaScript=1, Python=3}
HashMap 的核心操作
HashMap 类提供丰富方法。下文覆盖最常用者:
- 添加元素
- 访问元素
- 更新元素
- 移除元素
1. 添加元素
用 put() 插入键值对。键已存在则替换值。
import java.util.HashMap;
class Main {
public static void main(String[] args) {
HashMap<String, Integer> numbers = new HashMap<>();
System.out.println("初始 HashMap: " + numbers);
numbers.put("One", 1);
numbers.put("Two", 2);
numbers.put("Three", 3);
System.out.println("put() 后的 HashMap: " + numbers);
}
}
输出
初始 HashMap: {}
put() 后的 HashMap: {One=1, Two=2, Three=3}
本例中 Key 为 String,Value 为 Integer。
2. 访问元素
用 get(key) 获取值。键不存在返回 null。
import java.util.HashMap;
class Main {
public static void main(String[] args) {
HashMap<Integer, String> languages = new HashMap<>();
languages.put(1, "Java");
languages.put(2, "Python");
languages.put(3, "JavaScript");
System.out.println("HashMap: " + languages);
String value = languages.get(1);
System.out.println("键 1 对应的值: " + value);
}
}
输出
HashMap: {1=Java, 2=Python, 3=JavaScript}
键 1 对应的值: Java
也可通过 keySet()、values()、entrySet() 获取完整键集、值集合、条目集:
import java.util.HashMap;
class Main {
public static void main(String[] args) {
HashMap<Integer, String> languages = new HashMap<>();
languages.put(1, "Java");
languages.put(2, "Python");
languages.put(3, "JavaScript");
System.out.println("HashMap: " + languages);
System.out.println("Keys: " + languages.keySet());
System.out.println("Values: " + languages.values());
System.out.println("Entries: " + languages.entrySet());
}
}
输出
HashMap: {1=Java, 2=Python, 3=JavaScript}
Keys: [1, 2, 3]
Values: [Java, Python, JavaScript]
Entries: [1=Java, 2=Python, 3=JavaScript]
3. 更新值
replace(key, newValue) 替换指定键的现有值。返回旧值,键不存在返回 null。
import java.util.HashMap;
class Main {
public static void main(String[] args) {
HashMap<Integer, String> languages = new HashMap<>();
languages.put(1, "Java");
languages.put(2, "Python");
languages.put(3, "JavaScript");
System.out.println("原始 HashMap: " + languages);
languages.replace(2, "C++");
System.out.println("replace() 后: " + languages);
}
}
输出
原始 HashMap: {1=Java, 2=Python, 3=JavaScript}
replace() 后: {1=Java, 2=C++, 3=JavaScript}
4. 移除元素
用 remove(key) 删除映射,返回被移除的值。条件移除用 remove(key, value),仅当当前映射匹配指定值时才移除。
import java.util.HashMap;
class Main {
public static void main(String[] args) {
HashMap<Integer, String> languages = new HashMap<>();
languages.put(1, "Java");
languages.put(2, "Python");
languages.put(3, "JavaScript");
System.out.println("HashMap: " + languages);
String removed = languages.remove(2);
System.out.println("移除的值: " + removed);
System.out.println("更新后的 HashMap: " + languages);
}
}
输出
HashMap: {1=Java, 2=Python, 3=JavaScript}
移除的值: Python
更新后的 HashMap: {1=Java, 3=JavaScript}
HashMap 的其他方法
| 方法 | 说明 |
|---|---|
| clear() | 清空所有映射 |
| compute() | 为键计算新值 |
| computeIfAbsent() | 键缺失时计算值 |
| computeIfPresent() | 键存在时计算值 |
| merge() | 合并新映射与现有映射 |
| clone() | 创建浅拷贝 |
| containsKey() | 检查特定键 |
| containsValue() | 检查特定值 |
| size() | 键值对数量 |
| isEmpty() | 判断 Map 是否为空 |
遍历 HashMap
用 for-each 循环遍历键、值或条目。遍历条目需导入 java.util.Map.Entry。
import java.util.HashMap;
import java.util.Map.Entry;
class Main {
public static void main(String[] args) {
HashMap<Integer, String> languages = new HashMap<>();
languages.put(1, "Java");
languages.put(2, "Python");
languages.put(3, "JavaScript");
System.out.println("HashMap: " + languages);
System.out.print("Keys: ");
for (Integer key : languages.keySet()) {
System.out.print(key + ", ");
}
System.out.print("\nValues: ");
for (String value : languages.values()) {
System.out.print(value + ", ");
}
System.out.print("\nEntries: ");
for (Entry<Integer, String> entry : languages.entrySet()) {
System.out.print(entry + ", ");
}
}
}
输出
HashMap: {1=Java, 2=Python, 3=JavaScript}
Keys: 1, 2, 3,
Values: Java, Python, JavaScript,
Entries: 1=Java, 2=Python, 3=JavaScript,
从另一个 Map 创建 HashMap
用现有 Map 的内容实例化 HashMap:
import java.util.HashMap;
import java.util.TreeMap;
class Main {
public static void main(String[] args) {
TreeMap<String, Integer> evenNumbers = new TreeMap<>();
evenNumbers.put("Two", 2);
evenNumbers.put("Four", 4);
System.out.println("TreeMap: " + evenNumbers);
HashMap<String, Integer> numbers = new HashMap<>(evenNumbers);
numbers.put("Three", 3);
System.out.println("HashMap: " + numbers);
}
}
输出
TreeMap: {Four=4, Two=2}
HashMap: {Two=2, Three=3, Four=4}
可选构造器参数允许设置初始 容量 和 负载因子:
HashMap<K, V> numbers = new HashMap<>(8, 0.6f);
- 容量:重哈希前的条目数(8)。
- 负载因子:0.6 意味着 60% 满时触发扩容。
默认值为 capacity = 16 和 load factor = 0.75。
深入研究请参考官方 Java 文档或 Joshua Bloch 编著的《Effective Java》等权威资料。
java
- 精通 Java 运算符:类型、语法与实战示例
- Java 注释:类型、用法与最佳实践
- 精通 Java if…else:控制流全解析
- 精通 Java 增强 for 循环:语法、示例与最佳实践
- Java break 语句:用法、时机与标签 break 详解
- 精通 Java 字符串:创建、方法与最佳实践
- 精通 Java 接口:概念、实现与最佳实践
- 精通 Java 匿名内部类:定义、语法与实战示例
- 精通 Java Try-With-Resources:自动资源管理详解
- Java 注解详解:类型、放置位置与实战示例
- Java 断言实战指南:尽早发现 Bug 与保障代码可靠性
- 深入理解 Java Vector:用法、特性及与 ArrayList 的对比