Map中经常被忽略但又非常好用的方法
1. 简介
map是我们日常开发中常会的集合类之一, 但是我们除了常用的get
和put
之外,其他的方法好像很少会用到,接下来我们就介绍一下几个经常被忽略但又很好用的方法.
2. Quick Start
2.1 数据准备
创建一个map对象, 并声明几个用于测试的user对象
2.2 重温put
- key和value可以为null (hashmap 和 linkedhashmap)
- 使用null可以正常的覆盖和获取元素
- put可以直接新增or覆盖已有的元素
- put方法返回对应key的oldValue,如果没有oldValue则返回null
2.3 getOrDefault
-
当map中没有对应的key时, 返回对应的defaultValue
注意: 如果map中存在对应的key, 但是对应的
value == null
时, 返回的是null, 而不是defaultValue
源码如下:
2.4 putIfAbsent
- 如果指定的key对应的value不为null时(
oldValue != null
) : 不覆盖 & 返回oldValue - 当指定key的value不存在时(
oldValue == null
) : 添加元素 & 返回oldValue
可以理解为 当指定key的value不存在时, 才去put, 否则不添加
源码如下:
2.5 compute
remappingFunction返回值 != null
: 覆盖oldValue & 返回newValueremappingFunction返回值 == null
: 删除对应元素 & 返回null
可以理解为 使用remappingFunction的返回值覆盖对应key的旧值, 当remappingFunction返回值为null时, 会直接将当前元素移除掉
源码如下:
2.6 computeIfAbsent
oldValue != null
: 不覆盖 & 返回oldValueoldValue == null && mappingFunction返回值 != null
: 添加元素 & 返回newValueoldValue == null && mappingFunction返回值 == null
: 不覆盖 & 返回null
可以理解为 当指定key的value不存在时, 才使用mappingFunction的返回值覆盖对应key的旧值, 如果key对应value存在或者mappingFunction的返回值为null时, 则不覆盖
源码如下:
2.7 computeIfPresent
oldValue == null
: 不覆盖&返回nulloldValue != null && remappingFunction返回值 == null
: 移除元素&返回nulloldValue != null && remappingFunction返回值 != null
: 覆盖元素&返回newValue
可以理解为 当key对应的value存在时, 才使用remappingFunction的返回值覆盖对应key的旧值, 如果key对应的value不存在或者remappingFunction的返回值为null时, 则不覆盖
源码如下:
2.8 replace
- 替换指定key的value值
- 可以将对应的value设置为null
- 对应的key不存在时不会添加新元素
replace(K key, V oldValue, V newValue)
方法多了一层判断, 当key对应的value与oldValue相等时, 才会替换newValue
可以理解为 替换指定key的value值
源码如下:
2.9 merge
-
oldValue == null
: 使用传进来的 value 作为newValue,oldValue != null
: 使用remappingFunction的返回值作为newValue-
newValue == null
: 移除元素 & 返回newValue -
newValue != null
: 覆盖元素 & 返回newValue
-
可以理解为 融合三个值 分别为:
- key对应的value(oldValue)
- merge方法的第二个参数value (可以理解为oldValue的defaultValue)
- merge方法的第三个参数remappingFunction方法的返回值
融合逻辑为: 如果key对应的value不存在时, 使用merge方法的第二个参数value作为newValue, 如果key对应的value存在时,使用remappingFunction的返回值作为newValue, 如果newValue不为null则覆盖元素, 为null则移除元素
源码如下:
2.10 foreach
3. 总结
方法名称 | 方法参数 | 方法描述 | 方法特点 |
---|---|---|---|
put | key, value | 添加元素 | hashmap/linkedhashmap: key, value 都可以为null |
getOrDefault | key, defaultValue | 获取元素 | 当map中没有对应的key时, 返回defaultValue |
putIfAbsent | key, value | 当不存在时添加元素 | 这里不存在指的是: key对应的旧值为null |
compute | key, BiFunction<key, oldValue, newValue> remappingFunction | 重新计算key对应的value | 使用remappingFunction的返回值替换key的旧值 |
computeIfAbsent | key, Function<key, value> mappingFunction | 当不存在时计算 | 这里不存在指的是: key对应的旧值为null, 与putIfAbsent方法逻辑类似 |
computeIfPresent | key, BiFunction<key, oldValue, newValue> remappingFunction | 当存在时计算 | 这里存在指的是: key对应的旧值!=null |
replace | key, value | 替换元素 | 替换指定key的value, 不会添加元素 |
merge | key, value, BiFunction<oldValue, value, newValue> remappingFunction | 融合 | 融合key的旧值, 默认值, remappingFunction的返回值作为新值 |
foreach | BiConsumer<key, value> | 遍历 | java8新加的遍历方式 |
__EOF__

本文链接:https://www.cnblogs.com/ludangxin/p/18655751.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~