0

根据标题 - 什么限制了 HashMap 可以容纳的元素数量以及可以使用什么数据结构。

4

6 回答 6

2

hashCode返回 anint而不是 a的事实long也阻止HashMap了超过 2^32 个条目的效率。

于 2012-10-03T16:59:04.980 回答
1

一件事是最大数组大小,在 Java 中是Integer.MAX_VALUE.

如果这对您有限制,那么您可以创建自己的类来包装HashMap对象列表或使用LinkedHashMap.

于 2012-10-03T16:56:25.250 回答
0

我真的不认为有限制。

首先,一个对象的 hashCode 将始终适合最大数组大小,因为最大的 int 值给出了最大数组大小。

其次,afaik HashMap 使用列表作为键。因此,如果两个键具有相同的 hashCode(即使您只插入一些值也可能发生这种情况),它们无论如何都会被插入。由于列表可以随心所欲,因此除了效率之外没有真正的限制。

于 2012-10-03T17:00:28.340 回答
0

数据结构由底层哈希表的HashMap数组支持。因为必须使用整数指定 Java 数组大小,所以它们的大小被限制为Integer.MAX_VALUE(大约 20 亿个元素)。

如果需要对更多元素进行恒定时间查找,我想您可以将嵌套HashMap的 s 包装在自己的类定义中,但您还必须绕过 JavaCollection接口指定int大小值的事实 - 简而言之,它是可能有一个存储多个元素的数据结构,但是接口Integer.MAX_VALUE中的任何东西都没有真正支持这一点。Collection

于 2012-10-03T17:02:43.100 回答
0

唯一的约束是数组大小 (2^31-1) 和您的键类型可能的唯一值的数量。

于 2012-10-03T16:57:17.763 回答
0

除了您已经提到的堆大小之外,我认为您可以放入 HashMap 的项目数量没有任何硬性限制。

HashMaps 内部有一个“桶”数组,每个桶都是一个链表。当您添加一个项目时,它会被散列以找到正确的存储桶,然后添加到该链接列表的前面。因此,即使每个桶中都有一个项目,再添加一个项目只会将该项目添加到桶中的链表中。

我上面描述的行为是 Oracle JRE 附带的 HashMap 类的实现,在其他平台上可能会有所不同,因此其他平台可能对可以放入其中的项目数量有限制。

还值得指出的是,如果您将超过 Integer.MAX_VALUE 项放入 HashMap 中,则查找性能将大大降低,因为 HashMap 在尝试查找项时必须遍历列表。

于 2012-10-03T17:03:36.053 回答