当前位置: 首页 > news >正文

Java Map 常用方法大全

1. 基础操作
方法描述示例
put(K key, V value)添加键值对(覆盖旧值)map.put("a", 1)
get(Object key)获取指定键的值map.get("a") → 1
containsKey(Object key)检查是否包含键map.containsKey("a") → true
containsValue(Object value)检查是否包含值map.containsValue(1) → true
remove(Object key)删除指定键的映射map.remove("a") → 1
size()返回键值对数量map.size() → 1
isEmpty()检查是否为空map.isEmpty() → false
clear()清空所有映射map.clear()

2. 批量操作
方法描述示例
putAll(Map<? extends K, ? extends V> m)合并另一个Map的所有映射map1.putAll(map2)
replaceAll(BiFunction<? super K, ? super V, ? extends V> function)替换所有值map.replaceAll((k, v) -> v + 1)

3. 高级操作(Java 8+)
方法描述示例
computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction)键不存在时计算新值map.computeIfAbsent("a", k -> new ArrayList<>())
computeIfPresent(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction)键存在时重新计算值map.computeIfPresent("a", (k, v) -> v + 1)
compute(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction)强制计算新值(无论键是否存在)map.compute("a", (k, v) -> v == null ? 1 : v + 1)
merge(K key, V value, BiFunction<? super V, ? super V, ? extends V> remappingFunction)合并值(处理冲突)map.merge("a", 1, (old, new) -> old + new)
getOrDefault(Object key, V defaultValue)安全获取值(不存在时返回默认值)map.getOrDefault("b", 0) → 0
putIfAbsent(K key, V value)键不存在时插入值map.putIfAbsent("a", 1)

4. 遍历与视图
方法描述示例
forEach(BiConsumer<? super K, ? super V> action)遍历所有键值对map.forEach((k, v) -> System.out.println(k + ":" + v))
keySet()返回所有键的Set视图map.keySet() → ["a"]
values()返回所有值的Collection视图map.values() → [1]
entrySet()返回所有键值对的Set视图map.entrySet() → [{"a":1}]

5. 并发安全操作(ConcurrentHashMap特有)
方法描述示例
forEach(long parallelismThreshold, BiConsumer<? super K,? super V> action)并行遍历map.forEach(2, (k, v) -> process(k, v))
reduce(long parallelismThreshold, BiFunction<? super K,? super V,? extends U> transformer, BiFunction<? super U,? super U,? extends U> reducer)并行归约map.reduce(2, (k, v) -> v, (a, b) -> a + b)

6. 不可变Map(Java 9+)
方法描述示例
Map.of(k1, v1, k2, v2...)创建不可变Map(最多10个键值对)Map.of("a", 1, "b", 2)
Map.ofEntries(Map.Entry<? extends K,? extends V>... entries)通过Entry创建不可变MapMap.ofEntries(entry("a", 1), entry("b", 2))
Map.copyOf(Map<? extends K,? extends V> map)复制为不可变MapMap.copyOf(existingMap)

使用场景总结

  1. 快速查询get() / getOrDefault()

  2. 条件插入putIfAbsent() / computeIfAbsent()

  3. 原子更新compute() / merge()

  4. 批量处理forEach() / replaceAll()

  5. 并发安全ConcurrentHashMap 的并行方法

  6. 防御性编程Map.copyOf() 创建不可变Map


Java Map 关键方法对比表

方法名描述是否修改Map返回值典型应用场景示例
getOrDefault安全获取值,键不存在时返回默认值❌ 只读值或默认值避免Null检查的查询map.getOrDefault("a", 0) → 不存在时返回0
computeIfAbsent键不存在时,通过函数计算新值并插入;键存在时直接返回旧值✅ 条件写入旧值或新计算的值懒加载(如初始化列表)map.computeIfAbsent("a", k -> new ArrayList<>())
putIfAbsent键不存在时插入给定值;键存在时不做操作✅ 条件写入旧值或null原子性初始化(简单值)map.putIfAbsent("a", 1) → 不存在时插入1
computeIfPresent键存在时,通过函数重新计算值;键不存在时不做操作✅ 条件写入新值或null条件更新(如计数器重置)map.computeIfPresent("a", (k, v) -> v + 1) → 存在时值+1
compute无论键是否存在,都通过函数计算新值(可删除键)✅ 强制写入新值或null(若删除)复杂更新逻辑map.compute("a", (k, v) -> v == null ? 1 : v + 1)
merge合并新旧值(键不存在时插入给定值;存在时通过函数合并)✅ 条件写入合并后的值累加或去重map.merge("a", 1, (old, new) -> old + new) → 值累加
tips:

computeIfPresent 中的 k 参数详解

在 map.computeIfPresent("a", (k, v) -> v + 1) 中:

  • k 是当前处理的键(这里是 "a"),属于 BiFunction 的必需参数。

  • v 是该键对应的当前值。


核心区别总结

  1. 是否修改Map

    • 只读getOrDefault

    • 条件修改computeIfAbsentputIfAbsentcomputeIfPresentmerge

    • 强制修改compute

  2. 默认值/新值来源

    • 固定值putIfAbsentgetOrDefault

    • 函数生成computeIfAbsentcomputeIfPresentcompute

    • 合并函数merge

  3. 典型场景

    • 避免Null检查 → getOrDefault

    • 懒加载初始化 → computeIfAbsent

    • 原子性插入 → putIfAbsent

    • 条件更新 → computeIfPresent

    • 复杂合并逻辑 → merge


经典示例对比

1. 统计字符频率
// 方法1: getOrDefault + put(强制更新)
map.put(c, map.getOrDefault(c, 0) + 1);// 方法2: merge(更简洁)
map.merge(c, 1, (old, newVal) -> old + newVal);// 方法3: compute(完全控制)
map.compute(c, (k, v) -> v == null ? 1 : v + 1);
2. 初始化邻接表
// 方法1: computeIfAbsent(最优)
graph.computeIfAbsent(node, k -> new ArrayList<>()).add(neighbor);// 方法2: putIfAbsent + get(冗长)
if (!graph.containsKey(node)) {graph.put(node, new ArrayList<>());
}
graph.get(node).add(neighbor);

如何选择?

需求推荐方法原因
安全读取(带默认值)getOrDefault代码简洁,不修改Map
初始化复杂对象computeIfAbsent避免重复创建对象,线程安全(配合ConcurrentHashMap)
简单值原子插入putIfAbsent语义明确,性能稍优于computeIfAbsent
条件更新现有值computeIfPresent精准控制已有键的更新逻辑
复杂合并逻辑(如累加)merge内置合并函数,代码最简洁
http://www.dtcms.com/a/287303.html

相关文章:

  • 鸿蒙蓝牙通信
  • 高压电工作业证考试核心考点:电气安全基础篇
  • 异世界历险之数据结构世界(二叉树-leetcode)
  • 开发框架安全ThinkPHPLaravelSpringBootStruts2SpringCloud复现
  • 中间件安全攻防全解:从Tomcat到Weblogic反序列化漏洞介绍
  • 【Oracle】ORACLE OMF说明
  • windows 如何安装 wsl ubuntu
  • PostgreSQL 语法详解
  • Kubernetes常用命令总结
  • 突破研究边界!探索OpenAI o3与o4-mini模型的无限可能
  • Leetcode 05 java
  • Uniapp之自定义图片预览
  • CSS面试题及详细答案140道之(81-100)
  • 深度学习图像分类数据集—六十种植物病害分类
  • 微信小程序171~180
  • 嵌入式硬件中电感的基本原理与实现详解
  • 六种经典排序算法:从原理到 Java 实现
  • LVS的简介以及架构
  • 闲庭信步使用图像验证平台加速FPGA的开发:第二十四课——图像直方图和RGB图像叠加的FPGA实现
  • 【超详细笔记】概率:中心极限定理的直观理解——样本均值为何趋近正态
  • OpenCV 官翻 2 - 图像处理
  • 聊聊接口测试Postman环境与变量的深度应用
  • 黑马点评系列问题之p70postman报错“服务器异常”
  • Windows11下编译好的opencv4.8-mingw,可下载后直接用
  • 如何解决AttributeError: ‘NoneType‘ object has no attribute问题
  • 深入解析Linux文件重定向原理与dup2系统调用
  • Selenium 中 findElement 方法全解析:定位网页元素的 7 种方式
  • opencv圖片標注
  • 【办公类-107-02】20250719视频MP4转gif(削减MB)
  • 【Project】kafka+flume+davinci广告点击实时分析系统