10

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

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

谢谢!

4

4 回答 4

19

如果您看到文档

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

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

根据 put() 方法

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

于 2013-07-24T07:23:28.130 回答
8

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

于 2013-07-24T07:23:08.717 回答
1

不知道其他人是否发现上述反对意见。但作为一个新的 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)   
于 2020-11-17T13:17:51.973 回答
0

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

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

并在put(k,v)

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

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

于 2013-07-24T07:23:00.227 回答