Java 中 Map 集合
·
一、Map 基础认知(先建立概念)
Map 是 Java 中用于存储键值对(Key-Value) 的集合,核心特点:
- 键(Key)唯一,不能重复;值(Value)可以重复。
- 常用实现类:
HashMap(最常用,无序)、TreeMap(按 Key 排序)、LinkedHashMap(按插入顺序)。 - 入门先以
HashMap为例,因为它是日常开发中使用频率最高的。
二、Map 常用方法(从易到难)
1. 基础操作(入门级)
| 方法 | 作用 | 示例 |
|---|---|---|
put(K key, V value) |
添加 / 修改键值对(Key 存在则覆盖 Value) | map.put("name", "张三"); |
get(Object key) |
根据 Key 获取 Value,Key 不存在返回null |
String name = map.get("name"); |
size() |
获取键值对数量 | int len = map.size(); |
isEmpty() |
判断是否为空 | boolean empty = map.isEmpty(); |
containsKey(Object key) |
判断是否包含指定 Key | boolean hasName = map.containsKey("name"); |
containsValue(Object value) |
判断是否包含指定 Value | boolean hasZhang = map.containsValue("张三"); |
remove(Object key) |
根据 Key 删除键值对,返回被删除的 Value | String delValue = map.remove("name"); |
clear() |
清空所有键值对 | map.clear(); |
基础示例代码:
import java.util.HashMap;
import java.util.Map;
public class MapBasicMethod {
public static void main(String[] args) {
// 1. 创建HashMap对象(泛型指定Key为String,Value为String)
Map<String, String> userMap = new HashMap<>();
// 2. 添加键值对
userMap.put("name", "张三");
userMap.put("age", "20");
userMap.put("gender", "男");
// 3. 基础查询
System.out.println("获取name的值:" + userMap.get("name")); // 输出:张三
System.out.println("Map大小:" + userMap.size()); // 输出:3
System.out.println("是否包含key=age:" + userMap.containsKey("age")); // 输出:true
System.out.println("是否包含value=20:" + userMap.containsValue("20")); // 输出:true
// 4. 修改(Key存在则覆盖)
userMap.put("age", "21");
System.out.println("修改后的age:" + userMap.get("age")); // 输出:21
// 5. 删除
userMap.remove("gender");
System.out.println("删除后大小:" + userMap.size()); // 输出:2
// 6. 清空
userMap.clear();
System.out.println("清空后是否为空:" + userMap.isEmpty()); // 输出:true
}
}
2. 进阶操作(中级)
| 方法 | 作用 | 示例 |
|---|---|---|
putIfAbsent(K key, V value) |
仅当 Key 不存在时添加,避免覆盖 | map.putIfAbsent("name", "李四"); |
getOrDefault(Object key, V defaultValue) |
获取 Value,Key 不存在返回默认值 | String addr = map.getOrDefault("addr", "未知"); |
replace(K key, V value) |
仅当 Key 存在时修改 Value | map.replace("age", "22"); |
replace(K key, V oldValue, V newValue) |
仅当 Key 和旧 Value 都匹配时修改 | map.replace("age", "21", "22"); |
keySet() |
获取所有 Key 的集合(Set) | Set<String> keys = map.keySet(); |
values() |
获取所有 Value 的集合(Collection) | Collection<String> values = map.values(); |
entrySet() |
获取所有键值对的集合(Set<Map.Entry<K,V>>) | Set<Map.Entry<String,String>> entries = map.entrySet(); |
进阶示例代码:
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class MapAdvancedMethod {
public static void main(String[] args) {
Map<String, String> userMap = new HashMap<>();
userMap.put("name", "张三");
userMap.put("age", "20");
// 1. putIfAbsent:Key存在则不添加
userMap.putIfAbsent("name", "李四"); // name已存在,不会覆盖
System.out.println("putIfAbsent后的name:" + userMap.get("name")); // 输出:张三
// 2. getOrDefault:Key不存在返回默认值
String addr = userMap.getOrDefault("addr", "北京市");
System.out.println("地址:" + addr); // 输出:北京市
// 3. replace:精准修改
userMap.replace("age", "21"); // 直接修改age的值
userMap.replace("age", "21", "22"); // 仅当age=21时修改为22
System.out.println("replace后的age:" + userMap.get("age")); // 输出:22
// 4. 获取所有Key
Set<String> keys = userMap.keySet();
System.out.println("所有Key:" + keys); // 输出:[name, age]
// 5. 获取所有Value
Collection<String> values = userMap.values();
System.out.println("所有Value:" + values); // 输出:[张三, 22]
// 6. 获取所有键值对(Entry)
Set<Map.Entry<String, String>> entries = userMap.entrySet();
System.out.println("所有键值对:" + entries); // 输出:[name=张三, age=22]
}
}
3. 高级操作(Java 8+ 特性,偏难)
Java 8 为 Map 新增了一批基于 Lambda 的方法,简化复杂操作:
| 方法 | 作用 | 示例 |
|---|---|---|
forEach(BiConsumer<? super K,? super V> action) |
遍历所有键值对(Lambda 版) | map.forEach((k,v) -> System.out.println(k+":"+v)); |
compute(K key, BiFunction<? super K,? super V,? extends V> remappingFunction) |
根据 Key 和旧 Value 计算新 Value | map.compute("age", (k,v) -> String.valueOf(Integer.parseInt(v)+1)); |
merge(K key, V value, BiFunction<? super V,? super V,? extends V> remappingFunction) |
合并 Key 的 Value(Key 不存在则添加,存在则按规则合并) | map.merge("score", "80", (oldV, newV) -> String.valueOf(Integer.parseInt(oldV)+Integer.parseInt(newV))); |
高级示例代码:
import java.util.HashMap;
import java.util.Map;
public class MapJava8Method {
public static void main(String[] args) {
Map<String, String> userMap = new HashMap<>();
userMap.put("name", "张三");
userMap.put("age", "20");
userMap.put("score", "70");
// 1. forEach遍历(Lambda)
System.out.println("forEach遍历:");
userMap.forEach((key, value) -> System.out.println(key + "=" + value));
// 2. compute:修改Value(age+1)
userMap.compute("age", (k, v) -> {
if (v == null) return "0";
return String.valueOf(Integer.parseInt(v) + 1);
});
System.out.println("compute后的age:" + userMap.get("age")); // 输出:21
// 3. merge:合并Value(score=70+10=80)
userMap.merge("score", "10", (oldV, newV) ->
String.valueOf(Integer.parseInt(oldV) + Integer.parseInt(newV))
);
System.out.println("merge后的score:" + userMap.get("score")); // 输出:80
}
}
三、Map 遍历方式(从易到难)
1. 方式 1:遍历 Key,再通过 Key 获取 Value(入门级)
最简单的遍历方式,适合只需要 Key 或通过 Key 查 Value 的场景:
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class MapTraverse1 {
public static void main(String[] args) {
Map<String, String> userMap = new HashMap<>();
userMap.put("name", "张三");
userMap.put("age", "20");
userMap.put("gender", "男");
// 1. 获取所有Key的Set集合
Set<String> keys = userMap.keySet();
// 2. 遍历Key
for (String key : keys) {
// 3. 通过Key获取Value
String value = userMap.get(key);
System.out.println(key + "=" + value);
}
}
}
缺点:如果需要同时获取 Key 和 Value,每次get(key)会额外查询,效率略低。
2. 方式 2:遍历 Value(仅需 Value 时用,入门级)
只能获取 Value,无法获取对应的 Key,适合只关注 Value 的场景:
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
public class MapTraverse2 {
public static void main(String[] args) {
Map<String, String> userMap = new HashMap<>();
userMap.put("name", "张三");
userMap.put("age", "20");
// 1. 获取所有Value的Collection集合
Collection<String> values = userMap.values();
// 2. 遍历Value
for (String value : values) {
System.out.println(value);
}
}
}
缺点:丢失 Key 信息,适用场景有限。
3. 方式 3:遍历 EntrySet(中级,推荐)
直接遍历键值对(Entry),一次获取 Key 和 Value,效率最高,日常开发首选:
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class MapTraverse3 {
public static void main(String[] args) {
Map<String, String> userMap = new HashMap<>();
userMap.put("name", "张三");
userMap.put("age", "20");
// 1. 获取所有Entry的Set集合
Set<Map.Entry<String, String>> entries = userMap.entrySet();
// 2. 遍历Entry
for (Map.Entry<String, String> entry : entries) {
// 3. 获取Key和Value
String key = entry.getKey();
String value = entry.getValue();
System.out.println(key + "=" + value);
}
}
}
优点:效率高,能同时获取 Key 和 Value,是最常用的遍历方式。
4. 方式 4:Iterator 迭代器遍历(中级,支持删除)
遍历过程中可以安全删除元素(foreach 遍历中删除会抛异常):
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class MapTraverse4 {
public static void main(String[] args) {
Map<String, String> userMap = new HashMap<>();
userMap.put("name", "张三");
userMap.put("age", "20");
userMap.put("gender", "男");
// 1. 获取EntrySet的迭代器
Set<Map.Entry<String, String>> entries = userMap.entrySet();
Iterator<Map.Entry<String, String>> iterator = entries.iterator();
// 2. 遍历
while (iterator.hasNext()) {
Map.Entry<String, String> entry = iterator.next();
String key = entry.getKey();
String value = entry.getValue();
System.out.println(key + "=" + value);
// 3. 安全删除(比如删除gender)
if ("gender".equals(key)) {
iterator.remove();
}
}
System.out.println("删除后大小:" + userMap.size()); // 输出:2
}
}
优点:遍历中可安全删除元素;缺点:代码稍繁琐。
更多推荐

所有评论(0)