效率:HashMap检查containsKey()与始终put()

时间:2018-12-14 00:27:44

标签: java hashmap

如果我有一个HashMap,并且想要插入具有很多重复项的键值对,那么这样做会更好吗: if (!map.containsKey(key)) map.put(key, value);还是干脆map.put(key,value);不管键/值对是否已经存在?

5 个答案:

答案 0 :(得分:2)

如果您不关心骗子,只需map.put(key, value);。这样,您就无需进行额外的O(1)查找(包括对key进行散列,然后检查其是否存在)。

在最坏的情况下,如果重复插入完全相同的n-1对,可以为您节省大约(key, value)的额外查找。

答案 1 :(得分:2)

几乎可以肯定的答案是,这并没有真正的区别。首先获取正确的代码。它的配置文件(您似乎没有完成,或者在这种情况下您会知道的)。不要随意地进行优化/模糊处理,因为这似乎是个好主意。

通常,最大的性能影响将在于加载和编译代码。因此,最短,最简单的代码可能已经是最佳的。

答案 2 :(得分:2)

您应该使用方法putIfAbsent。如果您担心覆盖值。此方法从Java 8开始可用。

时间复杂度与put相同。

如果您可以覆盖最新的值,只需使用put

答案 3 :(得分:1)

Map::put使用相同的密钥覆盖条目,因此.put更加有效,而无需检查映射是否已包含密钥。

答案 4 :(得分:1)

putcontain都具有相同的渐近运行时间,因此同时使用两者最多将增加2倍,这是恒定的。因此,您的渐近运行时不会改变。但是由于put只会覆盖任何现有值(甚至返回旧值,如果是新值则返回null),因此速度快了2倍。