Map<String, String> map = rtMap.computeIfAbsent 与 Map<String, String> map = rtMap.getOrDefault 区别

两段代码的功能是相似的,都是在 rtMap 中存储数据,不过在实现方式上有所不同。我们来分析一下它们的区别以及哪种方式可能更好。

第一段代码:

java
Map<String, String> map = rtMap.computeIfAbsent(code, k -> new ConcurrentHashMap<>()); map.put(dataType.getKey(), value); rtMap.put(code, map);
  • computeIfAbsent:如果 rtMap 中没有 code 这个键,它会创建一个新的 ConcurrentHashMap 并将其放入 rtMap 中。如果有该键,它直接返回对应的 map,不需要重新创建。
  • 优点:
    • 只在需要时创建新的 map,避免了重复放入 code 键。
    • 简洁且高效,因为它避免了不必要的 put 操作。
  • 缺点:
    • map 的修改发生在 map 变量上,不需要显式地重新把 map 放回 rtMap。但从语义上看,你仍然将 map 存入 rtMap,因为 computeIfAbsent 只是修改了引用,并不会重新插入 code 键。

第二段代码:

java
Map<String, String> map = rtMap.getOrDefault(code, new ConcurrentHashMap<String, String>()); map.put(dataType.getKey(), value); rtMap.put(code, map);
  • 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 中已有大量数据时,它避免了不必要的重复操作。

posted @ 2024-11-20 20:11  锐洋智能  阅读(3)  评论(0编辑  收藏  举报