Map.putAll
相当于在地图上调用Map.put(k, v)
一次,用于指定地图中从键k到值v的每个映射。所以功能方面,两者都是一样的。
所以,我很想知道其他差异是什么以及何时使用哪一个?
答案 0 :(得分:9)
嗯,这取决于。
put
和putAll
是接口方法,因此该接口的每个实际实现都将保证put
方法放置单个键/值对在地图中,putAll
将放置来自源的所有键/值对。
但这取决于实现者如何来做这件事以及另外做什么(内部)。
当然,一个简单的实现会为源映射的每个条目调用put
,但也许有人发明了另一种方法来实现目标。或putAll
在输入添加对之前/之后/会做一些其他地图内部内容。
我的经验法则是:如果必须将所有键/值对从一个映射放到另一个映射,那么请依赖实现者的智能并使用putAll
方法。它总是很有可能提供比手动调用所有对put
更好的性能。
答案 1 :(得分:5)
如果您有要添加到地图的多个值的地图,请使用putAll(Map)
,并在您想要添加到地图中的一个或多个值时使用put(K,V)
putAll(Map)
只是在循环中调用put(K,V)
,请阅读source。
答案 2 :(得分:5)
正如文档中所述:
将指定值与。关联 此映射中的指定键 (可选操作)。如果是地图 以前包含了一个映射 键,旧值被替换为 指定值。 (据说地图m 如果和,则包含密钥k的映射 只有当m.containsKey(k)返回时 真。)
允许您在地图中放置一个键值对。
从中复制所有映射 指定地图到此地图(可选 操作)。这个电话的效果是 相当于调用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)
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()在组合两个地图时非常有用。