当前位置: 首页 > 面试题库 >

当达到HashMap或HashSet最大容量时会发生什么?

姚棋
2023-03-14
问题内容

几分钟前,我回答了一个问题,询问“ Java中HashMap的最大可能大小 ”。正如我一直阅读的那样, HashMap是一个可扩展的数据结构。
它的大小仅受JVM内存大小的限制。
因此,我认为它的大小没有硬性限制,因此做出了相应的回答。(同样适用于HashSet。)

但有人纠正我说,既然 大小() HashMap中的方法返回一个 INT ,还有 就是
它的大小有限制。完全正确的一点。我只是尝试在本地进行测试,但是失败了,我需要8GB以上的内存才能在HashMap中插入2147483483647个以上的整数,而我没有。

我的问题是:

  • 当我们尝试在HashMap / HashSet中插入2,147,483,647 + 1个元素时会发生什么?
  • 是否抛出错误?
  • 如果是,哪个错误?如果不是,那么HashMap / HashSet,它已经存在的元素和新元素会发生什么?

如果有人可以访问拥有16GB内存的计算机,那么您可以实际尝试一下。:)


问题答案:

阵列的基础容量必须是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);
}


 类似资料:
  • 问题内容: 在哈希图中,提供的键的哈希码用于将值放在哈希表中。在哈希集中,对象哈希码用于将值放置在基础哈希表中。即,哈希图的优点是您可以灵活地确定要作为密钥的内容,这样您就可以完成类似的事情。 这可以将诸如玩家名称之类的字符串映射到玩家本身。 我的问题是,当键的哈希码更改时,查找会发生什么情况。 我希望这不是Hashmap的主要关注点,因为我既不希望也不希望更改密钥。在前面的示例中,如果玩家名称更

  • 我在yarn cluster上运行的spark应用程序崩溃了,我正在试图确定根本原因。在我使用从yarn获得的日志中,我看到在块获取期间有一大堆连接被拒绝,还有一个内存不足错误。很难说出根本原因是什么。我的问题是当容器因为OutOfMemory异常而被杀死时会发生什么。因此,在容器日志中,我看到这是如何在容器上启动执行器的 我还看到许多。在应用程序崩溃之前,似乎有多个这样的问题。spark重试一个

  • 问题内容: 我想在HashSet和HashMap中找到最大的数字。假设我的HashSet中有数字[22,6763,32,42,33],我想在当前的HashSet中找到最大的数字。我该怎么做?对于HashMap也是如此。希望您能帮助我。谢谢。 问题答案: 您可以用来从任何集合中找到最大的元素。同样,对于,您可以在或上使用相同的方法,具体取决于您想要的是最大键值还是最大值。 另外,如果您愿意,可以使用

  • 如果数据库行的长度达到了大于max java.util.List length的值,并且我尝试获取所有数据,会发生什么?

  • 问题内容: 所以基本上我正在生成随机的10000个IP地址,我想存储在HashSet中找到的所有那些IP地址,但是根据我的计算,发现了大约6000个IP地址,但是在HashSet中仅存储了700个IP地址?HashSet在存储String方面是否有任何限制。任何建议将不胜感激。 问题答案: 就您而言,没有限制(限制是数组的最大大小,即2 ** 31)。 但是,仅存储 唯一 值,因此我的猜测是您仅生