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

时间:2010-11-08 12:18:55

标签: java performance hashmap

是否存在可以存储在HashMap中的键条目数的理论限制,还是纯粹依赖于可用的堆内存?

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

4 个答案:

答案 0 :(得分:43)

  

是否存在可以存储在HashMap中的密钥条目数量的理论限制,还是纯粹依赖于可用的堆存储?

关注the documentation of that class,我会说理论上的限制为Integer.MAX_VALUE(2 31 -1 = 2147483647)元素。

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

来自HashMap.size()

的文档
  

返回: 此地图中键值映射的数量

注意:此问题与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下)存在限制。一旦达到此限制,每次新添加都会导致哈希冲突 - 但除了性能之外,这不是问题......