Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.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 哈希集、向量、链接列表的最大大小_Java_Collections - Fatal编程技术网

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
    ,因此它的最大大小与此相同

    • HashMap
      使用的数组的大小始终是2的幂,因此它最多可以是230=1073741824个元素(因为下一个2的幂大于
      Integer.MAX_值
    • 通常,元件数量最多为铲斗数量乘以负载系数(默认为0.75)。但是,当
      HashMap
      停止调整大小时,它仍然允许您添加元素,利用每个bucket都是通过链表管理的事实。因此,
      HashMap
      /
      HashSet
      中元素的唯一限制是内存
  • Vector
    在内部使用一个数组,该数组的最大大小正好为
    Integer.MAX_VALUE
    ,因此它只能支持这么多元素
  • LinkedList
    不使用数组作为底层存储,因此不会限制大小。它使用经典的双链表结构,没有固有的限制,因此其大小仅受可用内存的限制。请注意,
    LinkedList
    如果大于
    Integer.MAX\u值,则会错误地报告大小,因为它使用
    int
    字段存储大小,
    size()
    的返回类型也是
    int
请注意,虽然API确实定义了大于
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字节的指针。大约四倍多。这是