【问题标题】:Map putAll overrides or adds?映射 putAll 覆盖或添加?
【发布时间】:2013-07-24 07:19:36
【问题描述】:

当我使用.putAll() 时,另一个.putAll() 会覆盖地图的内容吗? 我的地图会包含 SomeOfMyObjects 和 SomeOfMyObjects 吗?

Map<MyObject> blah = new HashMap<>();
blah.putAll('SomeOfMyObjects')
blah.putAll('SomeOfMyObjects')

谢谢!

【问题讨论】:

  • 试试看你就知道了。这比任何可能的答案都要好。
  • 没错,我需要在我的测试中涵盖它!

标签: java map


【解决方案1】:

If you see docs

将所有映射从指定映射复制到此映射(可选操作)。这个调用的效果等同于在指定映射中从键 k 到值 v 的每个映射调用一次 put(k, v) 在这个映射上。

this call is equivalent to that of calling put(k, v) 

对于as per put() method

将指定值与此映射中的指定键关联(可选操作)。如果映射先前包含键的映射,旧值将替换为指定值。 (当且仅当 m.containsKey(k) 将返回 true 时,映射 m 才被称为包含键 k 的映射。)

【讨论】:

  • “所以它永远不会覆盖......”但是你引用的文档说,“旧值被指定的值替换。”所以它确实覆盖。
【解决方案2】:

不确定是否有其他人认为上述建议反对。但作为一个新的 Jenkins/Groovy 用户,我必须自己测试它以验证并确认它会覆盖“put”和“putAll”。

        LinkedHashMap test = [X: 1]
        test.put("X", 2)
        assertTrue(test["X"] == 2)

        LinkedHashMap test = [X: 1]
        LinkedHashMap test2 = [X: 2]
        test.putAll(test2)
        assertTrue(test["X"] == 2)   

【讨论】:

    【解决方案3】:

    它的行为就像为参数映射中的每个条目调用put(k,v),所以它添加,保留映射中已经存在的任何内容。如果再次添加相同的键k,则其值v 将被覆盖。 putAll() 尝试通过首先在内部扩展映射以容纳新数据来优化批量添加,以避免中间调整大小/重新散列操作。

    【讨论】:

      【解决方案4】:

      根据the documentation,它只是添加了地图,并没有覆盖内容:

      这个调用的效果等价于对指定map中键k到值v的每次映射调用一次put(k,v)在这个map上

      put(k,v):

      如果映射先前包含键的映射,则旧值将替换为指定值。 (当且仅当 m.containsKey(k) 将返回 true 时,映射 m 才被称为包含键 k 的映射。)

      因此,使用此定义,它用新值覆盖现有键。

      【讨论】:

      • 根本不这么说,除非文档变了
      • 由于我的评论是从 2013 年开始的,我不记得当时它说了什么。但是如果你读过,它会说:这个调用的效果等同于在指定映射中从键 k 到值 v 的每个映射调用一次 put(k, v) 在这个映射上的效果。如果你去把:如果映射先前包含键的映射,则旧值将替换为指定值
      • 不管文档有没有变化,putAll 都会 put 全部。这种行为没有改变,即使文档从那时到现在都被改写了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-20
      • 2019-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-30
      • 2021-06-10
      相关资源
      最近更新 更多