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 中已有大量数据时,它避免了不必要的重复操作。
浙公网安备 33010602011771号