Hashmap容量与时间权衡

时间:2018-05-11 11:26:08

标签: java hashmap

我有一个非常直截了当的问题,但我无法弄清楚。问题是:

如果我们增加地图内部数组的大小(即地图的容量),它会增加执行时间(putget方法)?

2 个答案:

答案 0 :(得分:4)

简短回答:

Look the documentation,唯一可能影响putget时间的是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