根据标题 - 什么限制了 HashMap 可以容纳的元素数量以及可以使用什么数据结构。
6 回答
hashCode
返回 anint
而不是 a的事实long
也阻止HashMap
了超过 2^32 个条目的效率。
一件事是最大数组大小,在 Java 中是Integer.MAX_VALUE
.
如果这对您有限制,那么您可以创建自己的类来包装HashMap
对象列表或使用LinkedHashMap
.
我真的不认为有限制。
首先,一个对象的 hashCode 将始终适合最大数组大小,因为最大的 int 值给出了最大数组大小。
其次,afaik HashMap 使用列表作为键。因此,如果两个键具有相同的 hashCode(即使您只插入一些值也可能发生这种情况),它们无论如何都会被插入。由于列表可以随心所欲,因此除了效率之外没有真正的限制。
数据结构由底层哈希表的HashMap
数组支持。因为必须使用整数指定 Java 数组大小,所以它们的大小被限制为Integer.MAX_VALUE
(大约 20 亿个元素)。
如果需要对更多元素进行恒定时间查找,我想您可以将嵌套HashMap
的 s 包装在自己的类定义中,但您还必须绕过 JavaCollection
接口指定int
大小值的事实 - 简而言之,它是可能有一个存储多个元素的数据结构,但是接口Integer.MAX_VALUE
中的任何东西都没有真正支持这一点。Collection
唯一的约束是数组大小 (2^31-1) 和您的键类型可能的唯一值的数量。
除了您已经提到的堆大小之外,我认为您可以放入 HashMap 的项目数量没有任何硬性限制。
HashMaps 内部有一个“桶”数组,每个桶都是一个链表。当您添加一个项目时,它会被散列以找到正确的存储桶,然后添加到该链接列表的前面。因此,即使每个桶中都有一个项目,再添加一个项目只会将该项目添加到桶中的链表中。
我上面描述的行为是 Oracle JRE 附带的 HashMap 类的实现,在其他平台上可能会有所不同,因此其他平台可能对可以放入其中的项目数量有限制。
还值得指出的是,如果您将超过 Integer.MAX_VALUE 项放入 HashMap 中,则查找性能将大大降低,因为 HashMap 在尝试查找项时必须遍历列表。