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

Ebb*_*ham 36 java performance hashmap

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

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

aio*_*obe 43

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

看一下那个类的文档,我会说理论上的限制是Integer.MAX_VALUE(2 31 -1 = 2147483647)个元素.

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

从文档中 HashMap.size()

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

注意:此问题与列表最多可容纳的数据非常相似.


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

我想说这取决于你需要存储什么以及你需要什么类型的访问.所有内置系列都可能针对大批量进行了优化.

  • 实际上,`size()`并不是一个真正的问题:*如果地图包含的内容超过`Integer.MAX_VALUE`,则返回`Integer.MAX_VALUE`.* - http://download.oracle.com/javase/6/ docs/api/java/util/Map.html #size()只有客户端代码不能识别`size()`的真正含义应该是个问题. (5认同)

Boz*_*zho 11

HashMap将值保存在一个数组中,该数组最多可以容纳Integer.MAX_VALUE.但这并不算碰撞.每个Entry都有一个next字段,也是一个条目.这就是如何解决冲突(具有相同哈希码的两个或多个对象)的方式.所以我不会说有任何限制(除可用内存外)

请注意,如果超过Integer.MAX_VALUE,你会从一些方法得到意想不到的行为,如size(),但get()put()仍然可以工作.它们将起作用,因为hashCode()任何对象都将返回一个int,因此根据定义,每个对象都将适合地图.然后每个对象将与现有对象发生碰撞.