Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 除了堆大小之外,什么会限制HashMap可以容纳的元素数_Java_Hashmap - Fatal编程技术网

Java 除了堆大小之外,什么会限制HashMap可以容纳的元素数

Java 除了堆大小之外,什么会限制HashMap可以容纳的元素数,java,hashmap,Java,Hashmap,根据标题-什么限制了HashMap可以容纳的元素数量以及可以使用什么数据结构。一件事是最大数组大小,在Java中是 如果这对您是一个限制,那么您可以创建自己的类来包装HashMap对象列表,或者使用 一件事是最大数组大小,在Java中是 如果这对您是一个限制,那么您可以创建自己的类来包装HashMap对象列表,或者使用 唯一的约束是数组大小(2^31-1)和键类型可能的唯一值的数量。唯一的约束是数组大小(2^31-1)以及键类型可能的唯一值的数量。事实上,hashCode返回的是int而不是lo

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

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


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

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


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

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

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

事实上,
hashCode
返回的是
int
而不是
long
,这也阻止了
HashMap
的效率远远超过2^32个条目。

hashCode
返回的是
int
而不是
long
防止
HashMap
的效率远远超过2^32个条目。

我真的认为没有限制

首先,对象的哈希代码将始终适合最大数组大小,因为最大int值给出最大数组大小


其次,HashMap使用列表作为密钥。因此,如果两个键具有相同的哈希代码(即使只插入一些值,也可能发生这种情况),它们仍将被插入。因为列表可以得到你想要的任何时间,所以除了它的效率之外,没有真正的限制。

我真的认为没有限制

首先,对象的哈希代码将始终适合最大数组大小,因为最大int值给出最大数组大小


其次,HashMap使用列表作为密钥。因此,如果两个键具有相同的哈希代码(即使只插入一些值,也可能发生这种情况),它们仍将被插入。因为一个列表可以得到你想要的任何长度,所以除了它的效率之外,没有真正的限制。

HashMap数据结构由一个隐藏在引擎盖下的哈希表数组支持。因为Java数组大小必须使用整数指定,所以它们的大小限制为
Integer.MAX\u VALUE
(大约20亿个元素)


如果需要对更多元素进行常量时间查找,我想您可以在自己的类定义中封装嵌套的
HashMap
s,但您还必须绕开Java的
Collection
接口指定
int
size值这一事实——简而言之,可以有一个存储超过
整数.MAX_VALUE
元素的数据结构,但
集合
界面中的任何内容都不真正支持这一点。

HashMap数据结构由引擎盖下的哈希表数组支持。因为Java数组大小必须使用整数指定,所以它们的大小限制为
Integer.MAX\u VALUE
(大约20亿个元素)


如果需要对更多元素进行常量时间查找,我想您可以在自己的类定义中封装嵌套的
HashMap
s,但您还必须绕开Java的
Collection
接口指定
int
size值这一事实——简而言之,数据结构可以存储多个
Integer.MAX\u VALUE
元素,但是,
集合
界面中的任何东西都不真正支持这一点。

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

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

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


还值得指出的是,如果将多个Integer.MAX_值项放入HashMap中,查找性能将显著降低,因为在尝试查找项目时,HashMap必须在列表中进行迭代。

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

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

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


还值得指出的是,如果将多个Integer.MAX_值项目放入HashMap,则查找性能将显著降低,因为HashMap在尝试查找项目时必须遍历列表。

如果使用链接列表解决冲突,则项目计数没有其他限制。当然,如果每个插槽的项目比率不好,性能会受到影响。如果使用链表解决冲突,则项目计数没有其他限制。当然,如果每个插槽的项目数比率为bad@JohanSjöberg:我看不到r