根据标题 - 什么限制了HashMap可以容纳的元素数量以及可以使用的数据结构。
答案 0 :(得分:2)
hashCode
返回int
而不是long
的事实也会导致HashMap
的效率远远超过2 ^ 32个条目。
答案 1 :(得分:1)
有一件事是最大数组大小,在Java中是Integer.MAX_VALUE
。
如果这是对您的限制,那么您可以创建自己的类,其中包含HashMap
个对象的列表或使用LinkedHashMap
。
答案 2 :(得分:0)
唯一的约束是数组大小(2 ^ 31-1)和密钥类型可能的唯一值数。
答案 3 :(得分:0)
我认为没有限制。
首先,对象的hashCode总是适合最大数组大小,因为最大的int值给出了最大的数组大小。
其次,afaik HashMap使用列表作为其键。因此,如果两个键具有相同的hashCode(即使您只插入一些值也可能发生),它们将被插入。由于列表可以随意获得,除了效率之外没有任何实际限制。
答案 4 :(得分:0)
HashMap
数据结构由引擎盖下的哈希表的数组支持。由于必须使用整数指定Java数组大小,因此它们的大小限制为Integer.MAX_VALUE
(大约20亿个元素)。
如果需要更多元素的常量时间查找,我想你可以在你自己的类定义中包装嵌套的HashMap
,但是你也必须绕过Java的{{1}这个事实。接口指定Collection
大小值 - 简而言之,可能有一个存储多个int
元素的数据结构,但Integer.MAX_VALUE
中的任何内容都不支持这一点。接口
答案 5 :(得分:0)
除了你已经提到的堆大小之外,我不相信你可以放入HashMap的项目数量有任何硬性限制。
内部HashMaps有一个'桶'数组,每个桶都是一个链表。当您添加项目时,它会进行哈希处理以找到正确的存储桶,然后将其添加到该链接列表的前面。因此,即使每个桶中都有一个项目,添加一个项目只会将该项目添加到存储桶中的链接列表中。
我上面描述的行为是Oracle JRE附带的HashMap类的实现,可能在其他平台上有所不同,因此其他平台可能会对可放入其中的项目数量有所限制。 / p>
值得指出的是,如果您将多于Integer.MAX_VALUE项目放入HashMap中,查找性能将大大降低,因为HashMap在尝试查找项目时必须遍历列表。