几分钟后,我回答了一个问题,询问“ Java中HashMap的最大可能大小”。正如我一直读到的那样, HashMap是一种可扩展的数据结构。它的大小仅受JVM内存大小的限制。 因此我认为它的大小没有硬性限制,因此得到了回答。 (同样适用于HashSet。)
但有人纠正我的说法,因为HashMap的 size()方法返回 int , 是对其大小的限制。一个完全正确的观点。我只是尝试在我的本地测试但是失败了,我需要超过8GB的内存来在HashMap中插入超过2,147,483,647个整数,我没有。
我的问题是:
如果有人可以访问具有16GB内存的计算机,那么您可以尝试一下。 :)
答案 0 :(得分:18)
阵列的底层容量必须是2的幂(限制为2 ^ 30)当达到此大小时,负载因子被有效忽略,阵列停止增长。
此时碰撞率增加。
鉴于hashCode()只有32位,所以在任何情况下增长都不大。
/**
* Rehashes the contents of this map into a new array with a
* larger capacity. This method is called automatically when the
* number of keys in this map reaches its threshold.
*
* If current capacity is MAXIMUM_CAPACITY, this method does not
* resize the map, but sets threshold to Integer.MAX_VALUE.
* This has the effect of preventing future calls.
*
* @param newCapacity the new capacity, MUST be a power of two;
* must be greater than current capacity unless current
* capacity is MAXIMUM_CAPACITY (in which case value
* is irrelevant).
*/
void resize(int newCapacity) {
Entry[] oldTable = table;
int oldCapacity = oldTable.length;
if (oldCapacity == MAXIMUM_CAPACITY) {
threshold = Integer.MAX_VALUE;
return;
}
Entry[] newTable = new Entry[newCapacity];
transfer(newTable);
table = newTable;
threshold = (int)(newCapacity * loadFactor);
}
当大小超过Integer.MAX_VALUE时,它会溢出。
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);
}