Java数组可以包含的元素数量是否有限制?如果有,是什么?


当前回答

Java数组有一个限制,因为它是一个整数数组,这意味着它最多有2147,483,647个元素在数组中

其他回答

是的,java数组有限制。Java使用整数作为数组的索引,JVM存储的最大整数是2^32。你可以在数组中存储2147,483,647个元素。

如果你需要超过max-length,你可以使用两个不同的数组,但推荐的方法是将数据存储到一个文件中。因为在文件中存储数据是没有限制的。因为文件存储在存储驱动程序中,而数组存储在JVM中。JVM为程序执行提供了有限的空间。

实际上有两个限制。第一,数组可索引的最大元素;第二,应用程序可用的内存量。根据可用内存量和其他数据结构使用的内存量,您可能会在到达最大可寻址数组元素之前达到内存限制。

Java数组有一个限制,因为它是一个整数数组,这意味着它最多有2147,483,647个元素在数组中

使用

OpenJDK 64-Bit Server VM (build 15.0.2+7, mixed mode, sharing)

... 在MacOS上,答案似乎是整数。Max_value - 2。一旦你超越了这一点:

cat > Foo.java << "END"
public class Foo {
  public static void main(String[] args) {
    boolean[] array = new boolean[Integer.MAX_VALUE - 1]; // too big
  }
}
END
java -Xmx4g Foo.java

... 你会得到:

Exception in thread "main" java.lang.OutOfMemoryError:
  Requested array size exceeds VM limit

这(当然)完全依赖于vm。

浏览OpenJDK 7和8的源代码java.util。ArrayList, .Hashtable, .AbstractCollection, .PriorityQueue和.Vector,你可以看到这个声明被重复了:

/ * * *有些虚拟机在数组中保留一些头字。 *尝试分配更大的数组可能会导致 * OutOfMemoryError:请求的数组大小超过虚拟机限制 * / private static final int MAX_ARRAY_SIZE = Integer。Max_value - 8;

由马丁·布赫兹(谷歌)于2010-05-09添加;由Chris Hegarty (Oracle)审阅。

因此,可能我们可以说最大的“安全”数字将是2 147 483 639(整数。MAX_VALUE - 8)和“尝试分配更大的数组可能会导致OutOfMemoryError”。

(是的,布赫兹的独立声明不包括支持证据,所以这是对权威的一种有意的呼吁。甚至在OpenJDK内部,我们也可以看到类似return (minCapacity > MAX_ARRAY_SIZE) ?整数。Max_value: max_array_size;这表明MAX_ARRAY_SIZE还没有真正的用途。)