Java 哈希集、向量、链接列表的最大大小
Java 哈希集、向量、链接列表的最大大小,java,collections,Java,Collections,哈希集,向量,链接列表的最大大小是多少?我知道ArrayList可以存储3277000多个数字 但是,列表的大小取决于内存(堆)的大小。如果达到最大值,JDK将抛出一个OutOfMemoryError 但是我不知道HashSet、Vector和LinkedList中元素数量的限制。最大大小取决于JVM的内存设置,当然还有可用的系统内存。每个列表项的特定内存消耗大小在不同平台之间也有所不同,因此最简单的方法可能是运行简单的测试。在所有情况下,您都可能受到JVM堆大小的限制,而不是其他任何限制。最终
哈希集
,向量
,链接列表
的最大大小是多少?我知道ArrayList
可以存储3277000多个数字
但是,列表的大小取决于内存(堆)的大小。如果达到最大值,JDK将抛出一个OutOfMemoryError
但是我不知道
HashSet
、Vector
和LinkedList
中元素数量的限制。最大大小取决于JVM的内存设置,当然还有可用的系统内存。每个列表项的特定内存消耗大小在不同平台之间也有所不同,因此最简单的方法可能是运行简单的测试。在所有情况下,您都可能受到JVM堆大小的限制,而不是其他任何限制。最终,您将始终关注数组,因此我非常怀疑它们中的任何一个是否能够管理超过231-1个元素,但无论如何,在这之前,您很可能会耗尽堆。这些结构没有指定的最大大小
实际大小限制可能在Integer.MAX_VALUE
范围内(即2147483647,大约20亿个元素),因为这是Java中数组的最大大小
在内部使用HashSet
,因此它的最大大小与此相同HashMap
使用的数组的大小始终是2的幂,因此它最多可以是230=1073741824个元素(因为下一个2的幂大于HashMap
)Integer.MAX_值
- 通常,元件数量最多为铲斗数量乘以负载系数(默认为0.75)。但是,当
停止调整大小时,它仍然允许您添加元素,利用每个bucket都是通过链表管理的事实。因此,HashMap
/HashMap
中元素的唯一限制是内存HashSet
在内部使用一个数组,该数组的最大大小正好为Vector
,因此它只能支持这么多元素Integer.MAX_VALUE
不使用数组作为底层存储,因此不会限制大小。它使用经典的双链表结构,没有固有的限制,因此其大小仅受可用内存的限制。请注意,LinkedList
如果大于LinkedList
Integer.MAX\u值,则会错误地报告大小,因为它使用
字段存储大小,int
的返回类型也是size()
int
Integer.MAX_VALUE
元素的集合的行为方式。最重要的是,它指出:
如果此集合包含的元素超过Integer.MAX\u VALUE
个,则返回Integer.MAX\u VALUE
请注意,虽然HashMap
、HashSet
和LinkedList
似乎支持的元素多于Integer.MAX_VALUE
元素,但这些元素都没有以这种方式实现size()
方法(即,它们只是让内部size
字段溢出)
这让我相信,在这种情况下,其他操作也没有很好地定义
所以我想说,使用那些包含最多Integer.MAX_-VLAUE
元素的通用集合是安全的。如果您知道需要存储更多信息,那么您应该切换到实际支持此功能的专用集合实现。这在很大程度上取决于实现细节
哈希集使用数组作为基础存储,默认情况下,当集合已满75%时,它会尝试增长该存储。这意味着如果您尝试添加超过750000000个条目,它将失败。(无法将数组从2^30个条目增加到2^31个条目)
增加负载系数会增加集合的最大大小。e、 g.10的负载系数允许100亿个元件。(值得注意的是,由于32位哈希代码的分布开始变得不那么随机,并且冲突的数量增加,哈希集在超过1亿个元素时效率相对较低)
向量的容量加倍,从10开始。这意味着其增长将无法超过约13.4亿。将初始大小更改为2^n-1会稍微增加头部空间
顺便说一句:如果可以的话,使用ArrayList而不是Vector
LinkedList没有固有的限制,可以增长超过21亿。此时,size()可以返回Integer.MAX_值,但某些函数(如toArray)将失败,因为它无法将所有对象放入数组中,in将为您提供第一个Integer.MAX_值,而不是引发异常
正如@Joachim Sauer所指出的,对于大于Integer.MAX_值的大小,当前OpenJDK可能返回错误的结果。e、 g.可能是负数。如其他答案所述,数组不能到达2^31个条目。其他数据类型也会受到此限制,否则最终可能会误报其大小()。但是,某些系统无法达到这些理论极限:
在32位系统上,可用字节数绝对不会超过2^32。这是假设您没有占用内存的操作系统。32位指针是4个字节。任何不依赖数组的内容都必须在每个条目中至少包含一个指针:这意味着对于不使用数组的内容,条目的最大数量为2^32/4或2^30
一个普通数组可以达到它的理论极限,但是只有一个字节数组,一个长度为2^31-1的短数组将使用大约2^32+38字节
一些java虚拟机引入了一种使用压缩指针的新内存模型。通过调整指针对齐方式,32字节指针可以引用略多于2^32字节的指针。大约四倍多。这是