Java数组可以包含的元素数量是否有限制?如果有,是什么?
当前回答
实际上,它是java限制在2^30-4的上限,即1073741820。不是2 ^还有。不知道为什么,但我在jdk上手动测试。2^30-3仍然抛出vm除外
编辑:固定-1到-4,检查windows jvm
其他回答
是的,java数组有限制。Java使用整数作为数组的索引,JVM存储的最大整数是2^32。你可以在数组中存储2147,483,647个元素。
如果你需要超过max-length,你可以使用两个不同的数组,但推荐的方法是将数据存储到一个文件中。因为在文件中存储数据是没有限制的。因为文件存储在存储驱动程序中,而数组存储在JVM中。JVM为程序执行提供了有限的空间。
实际上有两个限制。第一,数组可索引的最大元素;第二,应用程序可用的内存量。根据可用内存量和其他数据结构使用的内存量,您可能会在到达最大可寻址数组元素之前达到内存限制。
使用
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
一个数组的最大元素数是(2^31)−1或2 147 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)
推荐文章
- 到底是什么导致了堆栈溢出错误?
- 为什么Android工作室说“等待调试器”如果我不调试?
- Java:路径vs文件
- ExecutorService,如何等待所有任务完成
- Maven依赖Servlet 3.0 API?
- 如何在IntelliJ IDEA中添加目录到应用程序运行概要文件中的类路径?
- getter和setter是糟糕的设计吗?相互矛盾的建议
- Android room persistent: AppDatabase_Impl不存在
- Java的String[]在Kotlin中等价于什么?
- Intellij IDEA上的System.out.println()快捷方式
- 使用Spring RestTemplate获取JSON对象列表
- Spring JPA选择特定的列
- URLEncoder不能翻译空格字符
- Java中的super()
- 如何转换JSON字符串映射<字符串,字符串>与杰克逊JSON