【问题标题】:Which one is better getOrDefault() or putIfAbsent() of HashMap in JavaJava中HashMap的getOrDefault()和putIfAbsent()哪个更好
【发布时间】:2015-04-09 13:05:31
【问题描述】:

如果我必须在 HashMap 中为一个键(对于许多键)设置值(如果不存在),那么使用哪个更好。 getOrDefault() 或 putIfAbsent() 因为这两种方法都将返回与键关联的值(如果已设置)。 两者都将键值对作为参数。

【问题讨论】:

  • 阅读文档会给你答案
  • 尝试一下也能得到答案。

标签: java dictionary


【解决方案1】:

是的,如果键已设置,它们都会返回与键关联的值,但一个只是 getter 而另一个是 setter。

putIfAbsent

如果指定的键尚未与值关联(或 映射到 null) 将其与给定值关联并返回 null, else 返回当前值。


getOrDefault

返回指定键映射到的值,或 如果此映射不包含键的映射,则为 defaultValue。


如果您的目标只是检索值,请使用getOrDefault。否则,如果要在值不存在时设置,请使用putIfAbsent

根据你的第一句话,

如果我必须在 HashMap 中为一个键(对于许多键)设置值,如果不是 那么现在哪个更好

你应该使用putIfAbsent

【讨论】:

    【解决方案2】:

    在 Java8 中也有 computeIfAbsent,如果存在则返回值,如果不存在,则通过 lambda 函数创建它,将其添加到 Map 并返回其值。

    Value v = map.computeIfAbsent(key, k -> new Value(f(k)));
    

    【讨论】:

    • 所以,基本上,computeIfAbsent 就像getOrPutDefaultAndGet ?
    • @Kathir,是的!虽然因为默认值的计算是一个 lambda,它只在键不存在时才会被调用,所以除非真的需要,否则不会调用默认值的计算。
    【解决方案3】:

    getOrDefault() 不会改变地图,因此如果您随后检查其内容,您将无法在地图中找到值,例如

    HashMap<String, String> map = new HashMap<>();
    map.getOrDefault("something", "default");  // returns "default"
    assertTrue(map.isEmpty());
    

    putIfAbsent() 确实会改变地图,因此如果您随后检查其内容,您会在地图中找到值,例如

    HashMap<String, String> map = new HashMap<>();
    map.putIfAbsent("something", "default");
    assertFalse(map.isEmpty());
    

    您应该选择适合您需要的那一款。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-30
      • 2018-01-09
      • 2018-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-17
      • 2019-02-01
      相关资源
      最近更新 更多