Java中Map相关操作
一、遍历
Map
中的 entrySet()
方法返回一个包含所有键值对的集合(Set<Map.Entry<K, V>>
),每个元素是 Map.Entry
类型(代表一个键值对)。通过遍历 entrySet
可以同时获取键和值,效率较高(无需通过键二次查询值)。
1. 增强 for 循环遍历(最常用)
import java.util.HashMap;
import java.util.Map;public class MapTraversal {public static void main(String[] args) {Map<String, Integer> map = new HashMap<>();map.put("苹果", 3);map.put("香蕉", 5);map.put("橙子", 2);// 遍历所有键值对for (Map.Entry<String, Integer> entry : map.entrySet()) {String key = entry.getKey(); // 获取键Integer value = entry.getValue(); // 获取值System.out.println(key + ":" + value);}}
}
2. Java 8+ Lambda 表达式(forEach
方法,简洁)
Java 8 为 Map
新增了 forEach
方法,可通过 Lambda 表达式简化遍历:
import java.util.HashMap;
import java.util.Map;public class MapTraversal {public static void main(String[] args) {Map<String, Integer> map = new HashMap<>();map.put("苹果", 3);map.put("香蕉", 5);map.put("橙子", 2);// Lambda 遍历键值对map.forEach((key, value) -> System.out.println(key + ":" + value));}
}
二、根据value排序
要根据 value
对 Map
排序,通常的思路是:
- 将
Map
中的键值对(entry
)转换为List
集合(因为List
支持自定义排序); - 对
List
中的元素(Map.Entry
)通过 自定义Comparator
按value
比较排序; - (可选)将排序后的
List
转换为LinkedHashMap
(保持排序后的顺序,因为HashMap
无序)。
示例代码:按 value
排序
假设我们有一个 Map<String, Integer>
,需要按 value
升序 / 降序排序:
1. 基础实现(升序排序)
import java.util.*;public class MapSortByValue {public static void main(String[] args) {Map<String, Integer> map = new HashMap<>();map.put("苹果", 3);map.put("香蕉", 5);map.put("橙子", 2);map.put("西瓜", 1);// 1. 将Map的entrySet转换为List(便于排序)List<Map.Entry<String, Integer>> entryList = new ArrayList<>(map.entrySet());// 2. 自定义Comparator,按value升序排序Collections.sort(entryList, new Comparator<Map.Entry<String, Integer>>() {@Overridepublic int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {// 比较两个entry的valuereturn o1.getValue().compareTo(o2.getValue());}});// 3. (可选)转换为LinkedHashMap保存排序结果(保持顺序)Map<String, Integer> sortedMap = new LinkedHashMap<>();for (Map.Entry<String, Integer> entry : entryList) {sortedMap.put(entry.getKey(), entry.getValue());}// 打印结果System.out.println("按value升序排序:" + sortedMap);// 输出:{西瓜=1, 橙子=2, 苹果=3, 香蕉=5}}
}
三、Java Map 常用 API 总结表
Map 是 Java 中存储键值对(Key-Value)的核心集合,常用实现类包括 HashMap
、TreeMap
、LinkedHashMap
等。以下表格整理了 Map 接口中最常用的 API,按功能分类便于快速查询。
功能分类 | 方法签名 | 功能描述 | 返回值类型 | 关键说明 |
---|---|---|---|---|
添加 / 修改元素 | V put(K key, V value) | 向 Map 中添加键值对;若 key 已存在,则覆盖原 value 并返回旧 value | V(旧 value,若 key 新则为 null) | 所有 Map 实现通用,是最核心的添加方法 |
void putAll(Map<? extends K, ? extends V> m) | 将另一个 Map 中的所有键值对添加到当前 Map,键冲突时覆盖当前 Map 的 value | void | 批量添加元素,常用于合并两个 Map | |
获取元素 | V get(Object key) | 根据 key 获取对应的 value;若 key 不存在,返回 null | V | 若 Map 中可能存储 null 值,需通过 containsKey() 确认 key 是否存在,避免误判 |
boolean containsKey(Object key) | 判断 Map 中是否包含指定 key | boolean | 检查 key 存在性的核心方法,比 get(key) != null 更准确(规避 value 为 null 的情况) | |
boolean containsValue(Object value) | 判断 Map 中是否包含指定 value | boolean | 底层需遍历所有 value,性能低于 containsKey() ,大量数据场景慎用 | |
删除元素 | V remove(Object key) | 根据 key 删除对应的键值对,并返回被删除的 value;若 key 不存在,返回 null | V | 删除指定 key 对应的元素,是最常用的删除方法 |
boolean remove(Object key, Object value) | 仅当 key 对应的 value 与指定 value 一致时,才删除该键值对,删除成功返回 true | boolean | JDK 8+ 新增,支持 “条件删除”,避免误删(如多线程场景) | |
遍历 / 获取集合 | Set<K> keySet() | 返回 Map 中所有 key 组成的 Set 集合 | Set<K> | 用于遍历所有 key,再通过 get(key) 获取 value,适合需单独处理 key 的场景 |
Collection<V> values() | 返回 Map 中所有 value 组成的 Collection 集合 | Collection<V> | 用于单独遍历所有 value,无法直接关联对应的 key | |
Set<Map.Entry<K, V>> entrySet() | 返回 Map 中所有键值对(Entry 对象)组成的 Set 集合 | Set<Map.Entry<K, V>> | 推荐的遍历方式,可同时获取 key 和 value,性能优于 keySet() +get(key) | |
其他常用操作 | int size() | 返回 Map 中键值对的数量 | int | 判断 Map 是否有元素的核心方法(size() == 0 等价于 isEmpty() ) |
boolean isEmpty() | 判断 Map 是否为空(无键值对) | boolean | 比 size() == 0 更直观,部分实现类(如 HashMap)会优化该方法的性能 | |
void clear() | 清空 Map 中的所有键值对,使 Map 变为空 | void | 清空后 size() 为 0,注意该操作会直接修改原 Map,而非创建新对象 | |
default V getOrDefault(Object key, V defaultValue) | 根据 key 获取 value;若 key 不存在,返回指定的 defaultValue | V | JDK 8+ 新增,避免手动判断 null,简化代码(如 map.getOrDefault(key, 0) ) |