HashSet、Vector、LinkedList 的最大大小

2022-09-01 10:17:57

的最大大小是多少 , ?我知道可以存储超过3277000个号码。HashSetVectorLinkedListArrayList

但是,列表的大小取决于内存(堆)大小。如果它达到最大值,JDK 将抛出一个 .OutOfMemoryError

但是我不知道 、 和 中的元素数的限制。HashSetVectorLinkedList


答案 1

这些结构没有指定的最大大小。

实际的实际大小限制可能位于区域(即2147483647,大约20亿个元素)的某个地方,因为这是Java中数组的最大大小。Integer.MAX_VALUE

  • A 在内部使用 a,因此它具有与该相同的最大大小HashSetHashMap
    • A 使用的数组的大小始终为 2 的幂,因此它最多可以是 230 = 1073741824个大元素(因为下一个 2 的幂大于 )。HashMapInteger.MAX_VALUE
    • 通常,元素数最多是存储桶数乘以负载因子(默认为 0.75)。但是,当停止调整大小时,它仍然允许您添加元素,利用每个存储桶都通过链表管理的事实。因此,/ 中元素的唯一限制是内存。HashMapHashMapHashSet
  • A 在内部使用一个数组,其最大大小正好为 ,因此它不能支持超过那么多的元素VectorInteger.MAX_VALUE
  • A 不使用数组作为基础存储,因此不会限制大小。它使用经典的双链表结构,没有固有的限制,因此其大小受可用内存的限制。请注意,如果 大于 ,a 将错误地报告大小,因为它使用字段来存储大小,并且返回类型也是 。LinkedListLinkedListInteger.MAX_VALUEintsize()int

请注意,虽然集合 API 确实定义了具有多个元素的 应如何运行。最重要的是,它声明size()文档CollectionInteger.MAX_VALUE

如果此集合包含多个元素,则返回 。Integer.MAX_VALUEInteger.MAX_VALUE

请注意,虽然 ,并且似乎支持多个元素,但这些元素都没有以这种方式实现该方法(即它们只是让内部字段溢出)。HashMapHashSetLinkedListInteger.MAX_VALUEsize()size

这使我相信,在这种情况下,其他操作也没有明确定义。

因此,我想说的是,将这些通用集合与元素一起使用是安全的。如果您知道需要存储更多内容,那么您应该切换到实际支持此功能的专用集合实现。Integer.MAX_VLAUE


答案 2

在所有情况下,您都可能受到 JVM 堆大小的限制,而不是其他任何限制。最终,你总是会深入到数组,所以我非常怀疑它们中的任何一个会管理超过231 - 1个元素,但无论如何,你都非常非常有可能在那之前用完堆。