我有一个非常直截了当的问题,但我无法弄清楚。问题是:
如果我们增加地图内部数组的大小(即地图的容量),它会增加执行时间(put
和get
方法)?
答案 0 :(得分:4)
简短回答:不。
Look the documentation,唯一可能影响put
和get
时间的是hashCode
实施。
此实现为基本操作(get和put)提供了恒定时间性能,假设散列函数在桶之间正确地分散元素。
当您拥有Hash Collision时会产生影响。当您为两个不同的对象使用相同的哈希码时会发生这种情况。
HashMap将根据hashCode计算位置,如果设置一个小的 initialCapacity 和一个非常大的 loadFactor ,它将发生哈希冲突,因此它将创建某些职位的名单。这意味着get
将在崩溃的元素列表上运行,而不是所有列表。
所以想象一下,你有一个N个阵列的M个元素。在最坏的情况下,它将是O(max(1, M/N))
。因此N
应该大于M
。
如果查看HashMap implementation,如果大小太大(占总容量的75%),则会调用调整大小操作。因此,初始容量不是最终容量,随着地图的增长,容量将始终更大。
初始容量的唯一问题是在需要之前存储内存。这可能会导致内存泄漏!
void addEntry(int hash, K key, V value, int bucketIndex) {
Entry<K,V> e = table[bucketIndex];
table[bucketIndex] = new Entry<K,V>(hash, key, value, e);
if (size++ >= threshold)
resize(2 * table.length);
}
答案 1 :(得分:-2)
是:http://java-performance.info/large-hashmap-overview-jdk-fastutil-goldman-sachs-hppc-koloboke-trove/
根据这个基准测试,通常你对地图所做的任何事情都会变得越慢。为每项工作选择正确的地图有助于缓解这种情况。
如果您只谈论容量,而不是规模,或许这个基准是您正在寻找的:https://pzemtsov.github.io/2015/12/14/choosing-the-hash-maps-capacity.html