Map.put和Map.putAll方法之间的区别?

时间:2011-04-28 09:06:53

标签: java dictionary collections interface

Map.putAll相当于在地图上调用Map.put(k, v)一次,用于指定地图中从键k到值v的每个映射。所以功能方面,两者都是一样的。

所以,我很想知道其他差异是什么以及何时使用哪一个?

8 个答案:

答案 0 :(得分:9)

嗯,这取决于。

putputAll是接口方法,因此该接口的每个实际实现都将保证put方法放置单个键/值对在地图中,putAll将放置来自源的所有键/值对。

但这取决于实现者如何来做这件事以及另外做什么(内部)。

当然,一个简单的实现会为源映射的每个条目调用put,但也许有人发明了另一种方法来实现目标。或putAll在输入添加对之前/之后/会做一些其他地图内部内容。

我的经验法则是:如果必须将所有键/值对从一个映射放到另一个映射,那么请依赖实现者的智能并使用putAll方法。它总是很有可能提供比手动调用所有对put更好的性能。

答案 1 :(得分:5)

如果您有要添加到地图的多个值的地图,请使用putAll(Map),并在您想要添加到地图中的一个或多个值时使用put(K,V)

大多数实现中的

putAll(Map)只是在循环中调用put(K,V),请阅读source

答案 2 :(得分:5)

正如文档中所述:

Map.put

  

将指定值与。关联   此映射中的指定键   (可选操作)。如果是地图   以前包含了一个映射   键,旧值被替换为   指定值。 (据说地图m   如果和,则包含密钥k的映射   只有当m.containsKey(k)返回时   真。)

允许您在地图中放置一个键值对。

Map.putAll

  

从中复制所有映射   指定地图到此地图(可选   操作)。这个电话的效果是   相当于调用put(k,   v)在此地图上为每个映射一次   从指定的键k到值v   地图。此操作的行为是   如果指定的地图是,则为undefined   操作进行时修改   进展。

将所有数据从一张地图放到另一张地图上。


  

何时使用哪一个?

如果您要将完整数据从一个地图复制到另一个地图,则可以使用map.putAll否则您只需使用map.put添加一个键值对。


  

Map.putAll相当于   在地图上调用Map.put(k,v)一次   对于从密钥k到值v的每个映射   在指定的地图中。所以   功能方面都是一样的。

否则当您在hasmap中实现地图然后使用put(k,v)将一个地图复制到另一个地图将需要更多努力,您可以使用putAll(m)说更多编码我们可以使用单行代码复制地图。 / p>

答案 3 :(得分:4)

由于Map只是一个接口,没有任何实现,因此除了功能差异之外,putAll和重复put之间没有任何区别,即无。如果你看一下Map的各个实现(例如HashMap),可能会出现性能问题。一个putAll应该至少与任何合理实现的重复put一样有效,但它可能完全相同。

答案 4 :(得分:2)

最明显的区别是同步集合。

对于同步地图,putAll会将所有条目添加为单个操作。如果您有两个线程尝试使用不同的值放置所有相同的键,则只能获得一组完整的值。即从第一个或第二个线程,但不是某种组合。

如果在两个线程中重复使用put(),则可以保留任何可能不是有效组合的值组合。


我已经看到/实现了put()和putAll()的事务操作。当putAll是事务性时,将添加所有或没有键/值。例如如果由于某种原因无法添加密钥或值。如果您正在使用put(),则只会停止个人密钥/值(可能还有任何未添加的密钥/值),执行可能不完整的更新。

答案 5 :(得分:1)

putAll( ) method

Copies all the elements from a specified map to the current Map object.    

<强> put( ) method

Adds an element at a specific key entry to a Map object.

答案 6 :(得分:1)

使用putAll而不是put时,我看到了巨大的性能优势。 请参阅以下示例程序:

公共类SampleTest {

public static void main(final String[] args) {

    final Map<String, String> testMap = new HashMap<>();
    final Map<String, String> testMap2 = new HashMap<>();

    final LocalDateTime startTestTime = LocalDateTime.now();
    for(int i=0; i < 1000000; i++) {
        testMap.put(i+"", i+"");
    }
    final LocalDateTime endTestTime = LocalDateTime.now();
    System.out.println("<<<<<<<<<Time for put>>>>>>>>>>>");
    System.out.println(ChronoUnit.MILLIS.between(startTestTime, endTestTime));

    final LocalDateTime startTestTime1 = LocalDateTime.now();
    testMap2.putAll(testMap);
    final LocalDateTime endTestTime1 = LocalDateTime.now();
    System.out.println("<<<<<<<<<Time for put all>>>>>>>>>>>");
    System.out.println(ChronoUnit.MILLIS.between(startTestTime1, endTestTime1));
}

}

返回(以毫秒为单位):

<<<<<<<<<Time for put>>>>>>>>>>>
1934
<<<<<<<<<Time for put all>>>>>>>>>>>
116

结论: putAll()绝对比put()具有以下免责声明更高效。 1.这个结果在我的机器上(即取决于机器配置)。但是你仍然看到了很大的不同。 2.如上所述,Map是一个接口,因此性能将取决于实现,我已经考虑过广泛使用的HashMap。 因此,如果性能是一个约束,那么至少可以使用适用于HashMap的putAll()。

答案 7 :(得分:0)

Map.put(Object key, Object value)允许您在while Map.putAll(Map t)中添加单个条目,将Map t中包含的所有条目添加到指定的Map。 putAll()在组合两个地图时非常有用。