Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Map.put和Map.putAll方法之间的区别?_Java_Dictionary_Collections_Interface - Fatal编程技术网

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

Java Map.put和Map.putAll方法之间的区别?,java,dictionary,collections,interface,Java,Dictionary,Collections,Interface,Map.putAll相当于调用Map.put(k,v)对指定映射中从键k到值v的每个映射在映射上放置一次。所以在功能方面,两者是相同的 因此,我很想知道其他的区别是什么以及何时使用哪一个?当您有一个包含多个值的映射要添加到映射时,请使用putAll(Map),当您有一个或多个值要添加到映射时,请使用put(K,V) putAll(Map)在大多数实现中,只需调用put(K,V)在一个循环中,阅读。 Copies all the elements from a specified map to t

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

因此,我很想知道其他的区别是什么以及何时使用哪一个?

当您有一个包含多个值的映射要添加到映射时,请使用
putAll(Map)
,当您有一个或多个值要添加到映射时,请使用
put(K,V)

putAll(Map)
在大多数实现中,只需调用
put(K,V)
在一个循环中,阅读。

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

Adds an element at a specific key entry to a Map object.
如文件所述:

将指定的值与 此映射中指定的键 (可选操作)。如果地图 以前包含了 键,旧值将替换为 指定的值。(一张地图称为m 包含键k的映射if and 只有m.containsKey(k)会回来 是的。)

允许您在映射中放置单个键值对

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

将所有数据从一个地图放到另一个地图


什么时候用哪个

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


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


否当您在hasmap中实现map时,那么使用put(k,v)将一个映射复制到另一个映射将花费更多的精力,您可以说使用putAll(m)进行更多的编码。我们可以使用单行代码复制映射。

map.put(对象键,对象值)
允许您在while
map.putAll(map t)中添加单个条目
将映射t中包含的所有条目添加到指定映射。当组合两个映射时,putAll()非常有用。

因为映射只是一个接口,没有任何实现,putAll和重复put之间除了功能上的差异之外,没有任何区别,即没有区别。如果您查看Map的各个实现(例如HashMap),可能存在性能问题。对于任何合理的实现,一次putAll至少应该与重复put一样有效,但可能完全相同。

好吧,这取决于具体情况

put
putAll
是接口方法,因此该接口的每个实际实现都将保证
put
方法在映射中放置单个键/值对,而
putAll
将放置源中的所有键/值对

但这取决于实现者如何做,以及(内部)要做什么

当然,一个简单的实现会为源映射的每个条目调用
put
,但是可能有人发明了另一种方法来实现这个目标。或者
putAll
将在输入添加对之前/之后/期间执行一些其他映射内部操作


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

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

对于synchornized映射,putAll将作为单个操作添加所有条目。如果有两个线程试图将所有相同的键放入不同的值,则只能得到一组完整的值。i、 e.从第一个或第二个螺纹开始,但不是某种组合

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



我已经看到/实现了put()和putAll()的事务操作。当putAll是事务性的时,将添加全部或无键/值。e、 g.如果由于某种原因无法添加键或值。如果使用put(),则只会停止单个键/值(可能还有任何未添加的键/值),执行可能不完整的更新。

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

公共类抽样测试{

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));
}
publicstaticvoidmain(最终字符串[]args){
final-Map testMap=new-HashMap();
final Map testMap2=新HashMap();
final LocalDateTime StartSetTime=LocalDateTime.now();
对于(int i=0;i<1000000;i++){
testMap.put(i+“”,i+“”);
}
final LocalDateTime endTestTime=LocalDateTime.now();
System.out.println(“>>”);
System.out.println(ChronoUnit.MILLIS.between(StartSetTime,endTestTime));
final LocalDateTime StartSetTime1=LocalDateTime.now();
testMap2.putAll(testMap);
final LocalDateTime endTestTime1=LocalDateTime.now();
System.out.println(“>>”);
System.out.println(ChronoUnit.MILLIS.between(startSetTime1,endTestTime1));
}
}

返回(以毫秒为单位):

>
1934
>>
116
结论: putAll()的性能肯定比put()更好,但有以下免责声明。 1.此结果在我的机器上(即取决于机器配置)。但你仍然看到了巨大的差异。 2.由于上面提到的映射是一个接口,所以性能将取决于实现,我考虑了HashMap,因为它被广泛使用。 因此,如果性能是一个约束条件,那么您至少可以选择putAll()作为HashMap。

+1-您击败了
<<<<<<<<<Time for put>>>>>>>>>>>
1934
<<<<<<<<<Time for put all>>>>>>>>>>>
116