是否存在可以存储在HashMap中的键条目数的理论限制,还是纯粹依赖于可用的堆内存?
此外,哪种数据结构最适合存储大量对象(比如数十万个对象)?
答案 0 :(得分:43)
是否存在可以存储在HashMap中的密钥条目数量的理论限制,还是纯粹依赖于可用的堆存储?
关注the documentation of that class,我会说理论上的限制为Integer.MAX_VALUE
(2 31 -1 = 2147483647)元素。
这是因为要正确实现此类,size()
方法必须返回表示键/值对数量的int
。
返回: 此地图中键值映射的数量
注意:此问题与How many data a list can hold at the maximum非常相似。
哪种数据结构最适合存储大量对象(比如数十万个对象)?
我想说这取决于您需要存储的内容以及您需要的访问类型。所有内置系列都可能针对大批量进行了优化。
答案 1 :(得分:11)
HashMap
保存数组中的值,最多可容纳Integer.MAX_VALUE
。但这并不算碰撞。每个Entry
都有一个next
字段,也是一个条目。这就是如何解决冲突(具有相同哈希码的两个或多个对象)的方式。所以我不会说有任何限制(除可用内存外)
请注意,如果超过Integer.MAX_VALUE
,您会从某些方法中获得意外行为,例如size()
,但get()
和put()
仍会有效。并且它们将起作用,因为任何对象的hashCode()
将返回int
,因此根据定义,每个对象将适合地图。然后每个对象将与现有对象发生冲突。
答案 2 :(得分:0)
我同意@ Bozho的说法,并且还要补充一点,你应该仔细阅读HashMap上的Javadoc。请注意它如何讨论初始容量和负载因子以及它们将如何影响HashMap的性能。
HashMap非常适合保存大量数据(只要你没有用完密钥或内存),但性能可能是个问题。
如果您发现无法在单个Java / JVM程序中操作所需的数据集,则可能需要查看分布式缓存/数据网格。
答案 3 :(得分:0)
没有理论限制,但存储不同的入口链(存储在不同的hashkey下)存在限制。一旦达到此限制,每次新添加都会导致哈希冲突 - 但除了性能之外,这不是问题......