如果我有一个HashMap,并且想要插入具有很多重复项的键值对,那么这样做会更好吗:
if (!map.containsKey(key)) map.put(key, value);
还是干脆map.put(key,value);
不管键/值对是否已经存在?
答案 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)
put
和contain
都具有相同的渐近运行时间,因此同时使用两者最多将增加2倍,这是恒定的。因此,您的渐近运行时不会改变。但是由于put
只会覆盖任何现有值(甚至返回旧值,如果是新值则返回null
),因此速度快了2倍。