Map<String, String> map = rtMap.computeIfAbsent 与 Map<String, String> map = rtMap.getOrDefault 区别
两段代码的功能是相似的,都是在 rtMap
中存储数据,不过在实现方式上有所不同。我们来分析一下它们的区别以及哪种方式可能更好。
第一段代码:
computeIfAbsent
:如果rtMap
中没有code
这个键,它会创建一个新的ConcurrentHashMap
并将其放入rtMap
中。如果有该键,它直接返回对应的map
,不需要重新创建。- 优点:
- 只在需要时创建新的
map
,避免了重复放入code
键。 - 简洁且高效,因为它避免了不必要的
put
操作。
- 只在需要时创建新的
- 缺点:
- 对
map
的修改发生在map
变量上,不需要显式地重新把map
放回rtMap
。但从语义上看,你仍然将map
存入rtMap
,因为computeIfAbsent
只是修改了引用,并不会重新插入code
键。
- 对
第二段代码:
getOrDefault
:如果rtMap
中没有code
键,它会返回一个新的ConcurrentHashMap
(并不会插入该键)。如果有code
键,则返回对应的map
。- 优点:
- 可以确保即使
code
不存在,也能正常返回一个新的ConcurrentHashMap
。 - 代码简洁,逻辑上也没有错误。
- 可以确保即使
- 缺点:
- 无论
map
是否已经存在,都会将它放回rtMap
,这意味着对于已经存在的code
键,会执行多余的put
操作,从性能角度来看是一个浪费。
- 无论
哪种更好?
- 性能方面:第一段代码通常更高效,因为
computeIfAbsent
只有在code
不存在时才会插入新的map
,避免了对已存在的键执行多余的put
操作。而第二段代码每次都会执行一次put
,即使code
已经有对应的map
,这是不必要的操作。 - 语义清晰度:第一段代码的意图更明确——仅当
rtMap
中没有code
键时才会创建新的map
。第二段代码的意图虽然也清晰,但getOrDefault
返回的新map
会导致每次都重新将map
放回rtMap
,略显冗余。
因此,从性能和代码简洁性角度来看,第一段代码更加优越,特别是在 rtMap
中已有大量数据时,它避免了不必要的重复操作。