Java HashMap中可存储的键(对象)数量的理论限制?

Java HashMap中可存储的键(对象)数量的理论限制?,java,performance,hashmap,Java,Performance,Hashmap,HashMap中可以存储的键条目的数量是否有理论限制,或者最大值是否完全取决于可用的堆内存 另外,哪种数据结构最适合存储大量对象(比如几十万个对象)?HashMap保存数组中的值,数组最多可以保存整数.MAX\u值。但这不包括碰撞。每个条目都有一个next字段,该字段也是一个条目。这就是解决冲突(两个或多个具有相同哈希代码的对象)的方法。所以我不会说有任何限制(除了可用内存) 请注意,如果超过Integer.MAX\u值,您将从某些方法中获得意外行为,如size(),但get()和put()仍将

HashMap中可以存储的键条目的数量是否有理论限制,或者最大值是否完全取决于可用的堆内存


另外,哪种数据结构最适合存储大量对象(比如几十万个对象)?

HashMap
保存数组中的值,数组最多可以保存
整数.MAX\u值。但这不包括碰撞。每个
条目
都有一个
next
字段,该字段也是一个条目。这就是解决冲突(两个或多个具有相同哈希代码的对象)的方法。所以我不会说有任何限制(除了可用内存)

请注意,如果超过
Integer.MAX\u值
,您将从某些方法中获得意外行为,如
size()
,但
get()
put()
仍将有效。它们会起作用,因为任何对象的
hashCode()
都会返回一个
int
,因此根据定义,每个对象都适合映射。然后每个对象将与现有对象碰撞

HashMap中可以存储的键条目的数量是否有理论限制,还是完全取决于可用的heapmemory?

看看,我会说理论极限是
整数.MAX_VALUE
(231-1=2147483647)个元素

这是因为要正确实现此类,该方法必须返回一个
int
,表示键/值对的数量

根据

返回:此映射中键值映射的数目

注:此问题与


哪种数据结构最适合存储大量对象(比如几十万个对象)?


我想说这取决于你需要存储什么以及你需要什么类型的访问。所有内置的收藏可能都经过了大量优化。

我同意@Bozho的观点,并补充说您应该仔细阅读HashMap上的内容。注意它如何讨论初始容量和负载因子,以及它们将如何影响HashMap的性能

HashMap非常适合保存大型数据集(只要您没有用完密钥或内存),但性能可能是一个问题


如果发现无法在单个Java/JVM程序中操作所需的数据集,则可能需要查看分布式缓存/数据网格。

理论上没有限制,但存储不同入口链(存储在不同的哈希键下)的存储桶是有限的。一旦达到此限制,每次新添加都会导致哈希冲突——但除了性能之外,这不是问题……

您的意思是询问唯一键的数量还是条目的数量?我可以发誓HashMap是用bucket构建的,所以虽然最多有Integer.MAX_值bucket,但每个bucket都可以有一个包含很多条目的列表。有趣的问题是,我的+1不同的人对大的概念有不同的看法。你能说得更具体一点吗,你是说100、1000、数百万、数百万、万亿吗?是的,我已经指定了大小(几十万或几百万)我最喜欢的问题是我的+1 HashMap文档#size()实际上将键值映射的数量限制为可以用int表示的数字。如果HashMap允许更多映射,size()方法的文档将继承自Map#size(),它定义了在size为>Integer.MAX_值时返回Integer.MAX_值的方法。
hashCode()
返回
int
。因此,在表满后,只会发生冲突。我刚刚注意到size():int方法:)实际上,
size()
并不是一个真正的问题:如果映射包含超过
Integer.MAX\u VALUE
元素,则返回
Integer.MAX\u VALUE
-只有客户端代码无法识别
size()
的真正含义才是问题。@gustafc,啊,有趣的一点。然而,
HashMap.size()
的文档细化了这个规范:但是,这是否可能是规范中的一个“bug”是值得怀疑的:-)@aioobe-好吧,看看Sunoracle实现的
HashMap
,它似乎并没有真正怀疑
size
字段是否会溢出。规范合规性?:)所以,也许我应该说“
size()
不应该真的是个问题”…@jarnbjo,我不完全相信这不会得到解决-我们可以争辩说,可能有代码依赖HashMap正确地实现Map。当我或aioobe的错误报告得到响应时,我们将看到谁是对的。