getOrDefault能替代if-else空判断,因其将“查不到就用默认值”逻辑封装为一次调用,语义明确、性能更优,但不写入Map且无法区分null是未命中还是真实值。
Map.getOrDefault 为什么能替代 if-else 空判断
它直接把「查不到就用默认值」这个逻辑封装进一次调用,省掉
或
判断。不是语法糖,是语义明确的意图表达——你要的不是“有没有”,而是“有就取,没有就给个兜底”。
常见错误现象:
来自对
结果直接调用方法(比如
或
),却没确认是否为
。
适用场景:统计计数(
)、配置 fallback、缓存缺省值
注意:默认值是「被返回」的值,不是「被写入 Map」的值;想同时写入得额外调用
性能影响极小,底层就是一次哈希查找 + 一次三元判断,比两次查找(先
再
)更优
getOrDefault 的参数陷阱:默认值对象生命周期要注意
第二个参数传的是值,不是引用;如果传的是可变对象(比如
),每次调用都会新建一个,不会共享。但如果你传的是常量或静态对象(如
),就得小心并发修改或意外污染。
别写
—— 每次都新建,浪费;应改用
推荐用不可变默认值:比如
、
、
如果默认值需计算(比如当前时间戳),必须包在 lambda 里延迟执行,否则提前求值,失去“仅缺省时才用”的语义
和 computeIfAbsent / compute 区别在哪?什么情况下不该用 getOrDefault
是只读操作,不改变 Map;
是“查无则建并存”,适合构建缓存;
是“查有则改,无则设”。三者目的不同,混用会出逻辑漏洞。
Eclipse导入Android或其他的JAVA项目的正确方法 WORD版
本文档主要讲述的是Eclipse导入Android或其他的JAVA项目的正确方法;希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
下载
立即学习
“
Java免费学习笔记(深入)
”;
错误用法:用
想初始化并写入 Map → 实际没写入,下次还走默认分支
正确对应关系:
– 只读取 + 缺省兜底 →
– 首次访问才创建对象并缓存 →
– 基于旧值更新(如累加)→
或
兼容性:Java 8+,Android API 24+;低版本需回退到手动判空
嵌套 Map 场景下 getOrDefault 容易漏掉的层级空指针
比如
,看着安全,但如果第一层返回的是
(比如你误用了弱类型 Map,或上游传了 null),那链式调用仍会崩在
上。
根本原因:
不保证返回非
,它只保证“查不到 key 就返回你给的 default”;但如果你的 Map 本身存了
值,那
就返回
,
也拦不住
防御写法:对外部输入的 Map,先判空;或统一用
强制兜底
更稳妥的做法:定义清晰契约,禁止 Map 存
值(Guava 的
或
天然杜绝)
真正难处理的从来不是怎么写默认值,而是搞清「这个 null 到底是没查到,还是查到了一个 null」——前者
能救,后者它不管。
containsKey== nullNullPointerExceptionmap.get(key).toString().size()nullmap.put(k, map.getOrDefault(k, 0) + 1)putcontainsKeygetnew ArrayList()Collections.EMPTY_LISTmap.getOrDefault("key", new HashMap())map.computeIfAbsent("key", k -> new HashMap())Map.of()Collections.emptySet()Optional.empty()getOrDefaultcomputeIfAbsentcomputegetOrDefault(k, initValue)getOrDefaultcomputeIfAbsentcomputemergemap.getOrDefault("user", Collections.emptyMap()).getOrDefault("profile", "N/A")null.getOrDefaultgetOrDefaultnullnullgetnullgetOrDefaultObjects.requireNonNullElse(map.get(key), defaultValue)nullImmutableMapMap.of()getOrDefault