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


当前回答

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

其他回答

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

我试着创建一个这样的字节数组

byte[] bytes = new byte[Integer.MAX_VALUE-x];
System.out.println(bytes.length);

使用这个运行配置:

-Xms4G -Xmx4G

及java版本:

Openjdk version "1.8.0_141" OpenJDK运行时环境(build 1.8.0_141-b16) OpenJDK 64位服务器虚拟机(build 25.141-b16,混合模式)

它只适用于x >= 2,这意味着数组的最大大小是Integer。MAX_VALUE-2

高于此值

java.lang.OutOfMemoryError:请求的数组大小超过虚拟机限制 Main.main (Main.java: 6)

使用

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

通过这篇文章http://en.wikipedia.org/wiki/Criticism_of_Java#Large_arrays:

Java一直被批评不支持超过231 - 1(约21亿)个元素的数组。这是语言的局限性;Java语言规范第10.4节规定: 数组必须以int值为索引…访问数组的尝试 组件具有较长的索引值将导致编译时错误。

支持大型数组还需要对JVM进行更改。这种限制体现在一些方面,例如集合被限制在20亿个元素,以及无法内存大于2 GiB的映射文件。Java还缺乏真正的多维数组(通过单一间接方式访问连续分配的单个内存块),这限制了科学和技术计算的性能。

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