Java hashmap 的最大大小是 5770 吗?

9

今天我在测试文件/个人资料的传输。我使用了一个HashMap来存储玩家姓名和其个人资料值。然而我发现我的哈希表只能达到5770的大小。这是为什么,我该如何解决呢?

HashMap<String, String> temp = new HashMap<String, String>();
for(String s : dataFile.getConfigurationSection("users").getKeys(false)) {
        temp.put(s, dataFile.getString("users." + s + ".group"));
}

这是我用来获取玩家及其“组”的方法。

3
你怎么说“我的哈希表只能存到5770个大小”?你是如何检查的? - ortis
@ortis 对不起,我有一个 System.out.println(temp.size()); - SirNickParks
1
这不是最大尺寸,而是“HashMap”的当前尺寸。“HashMap”大小仅受JVM堆大小和“Integer.MaxValue”的限制。 - ortis
@ortis 嗯,我明白这一点,但我的问题是我有11,000个配置文件要传输,而它只加载了5770个。 - SirNickParks
2
变量s可能不唯一吗?因为如果在HashMap中已经存在一个键,当调用temp.put时,它将被新的键覆盖。 - ortis
显示剩余6条评论
2个回答

16

HashMap并没有限制,只要负载因子增加即可。

在Sun的JVM中,HashMap使用大小为2的幂次方的数组。最大允许的幂次方数组大小是2^30。在默认负载因子下,可以存储的最大元素数量为(2^30 * 负载因子)或约7亿个元素,此时HashMap会尝试将其大小加倍到2^31(但无法做到)。


8
数组的索引是整数,这就是数组最大尺寸的“限制”。2的幂是数组增加的模式。 - Cratylus

15

HashMap并没有限制,你遇到的问题可能是因为你有重复的键。

在将它放入映射之前,我会检查该键是否已经存在:

if(temp.containsKey(s)){
 System.out.println("Erasing key "+s+" val "+temp.get(s));
}
temp.put(s, dataFile.getString("users." + s + ".group"));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接