Java数组可以包含的元素数量是否有限制?如果是这样,它是什么?
答案 0 :(得分:169)
没有看到正确的答案,即使它很容易测试。
在最近的HotSpot VM中,正确的答案是Integer.MAX_VALUE - 5
。一旦你超越了这个:
public class Foo {
public static void main(String[] args) {
Object[] array = new Object[Integer.MAX_VALUE - 4];
}
}
你得到:
Exception in thread "main" java.lang.OutOfMemoryError:
Requested array size exceeds VM limit
答案 1 :(得分:118)
这(当然)完全取决于VM。
浏览OpenJDK 7和8 java.util.ArrayList
,.Hashtable
,.AbstractCollection
,.PriorityQueue
和.Vector
的源代码,您可以看到声明重复:
/** * Some VMs reserve some header words in an array. * Attempts to allocate larger arrays may result in * OutOfMemoryError: Requested array size exceeds VM limit */ private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
由Martin Buchholz(谷歌)on 2010-05-09添加;由Chris Hegarty(Oracle)审核。
所以,可能我们可以说最大的“安全”数字是 2 147 483 639 (Integer.MAX_VALUE - 8
)和“尝试分配更大的数组可能会导致OutOfMemoryError“。
(是的,Buchholz的独立声明不包括支持证据,因此这是一个计算appeal to authority.即使在OpenJDK本身,我们也可以看到像return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE;
这样的代码,表明MAX_ARRAY_SIZE
没有但是真正的使用。)
答案 2 :(得分:38)
实际上有两个限制。一个是数组可索引的最大元素,另外两个是应用程序可用的内存量。根据可用内存量和其他数据结构使用的数量,您可能会在达到最大可寻址数组元素之前达到内存限制。
答案 3 :(得分:26)
完成本文http://en.wikipedia.org/wiki/Criticism_of_Java#Large_arrays:
Java因为不支持超过2个 31 -1(约21亿)元素的数组而受到批评。这是语言的限制; Java语言规范第10.4节规定:
数组必须用int值索引...尝试访问数组 具有长索引值的组件会导致编译时错误。
支持大型数组也需要更改JVM。此限制表现在诸如集合限制为20亿个元素以及无法存储大于2 GiB的映射文件的区域中。 Java还缺少真正的多维数组(连续分配单个内存访问的单个内存块),这限制了科学和技术计算的性能。
答案 4 :(得分:10)
数组是非负整数索引,因此您可以访问的最大数组大小为Integer.MAX_VALUE
。另一件事是你可以创建多大的数组。它取决于JVM
可用的最大内存和阵列的内容类型。例如,每个数组元素都有它的大小。 byte = 1 byte
,int = 4 bytes
,Object reference = 4 bytes (on a 32 bit system)
因此,如果您的计算机上有1 MB
个内存,则可以分配byte[1024 * 1024]
或Object[256 * 1024]
的数组。
回答您的问题 - 您可以分配一个大小数组(最大可用内存/数组项大小)。
摘要 - 从理论上讲,数组的最大大小为Integer.MAX_VALUE
。实际上,这取决于JVM
有多少内存以及已经分配给其他对象的内存量。
答案 5 :(得分:3)
我试图像这样创建一个字节数组
NumOfClicks
使用此运行配置:
domain
和java版本:
Openjdk版本" 1.8.0_141"
OpenJDK运行时环境(版本1.8.0_141-b16)
OpenJDK 64位服务器VM(版本25.141-b16,混合模式)
它仅适用于x> = 2,这意味着数组的最大大小为Integer.MAX_VALUE-2
上面给出的值
线程中的异常" main" java.lang.OutOfMemoryError:请求的数组大小超过VM限制 在Main.main(Main.java:6)
答案 6 :(得分:1)
array
的最大元素数为(2^31)−1
或2 147 483 647
答案 7 :(得分:1)
是的,java数组有限制。 Java使用整数作为数组的索引,JVM的最大整数存储为2 ^ 32。因此您可以在数组中存储2,147,483,647个元素。
如果您需要的长度超过最大长度,则可以使用两个不同的数组,但是建议的方法是将数据存储到文件中。因为在文件中存储数据没有限制。因为文件存储在存储驱动程序中,但数组存储在JVM中。 JVM为程序执行提供了有限的空间。
答案 8 :(得分:0)
实际上,这是Java的限制,将其上限限制为2 ^ 30-4,即1073741820。而不是2 ^ 31-1。 Dunno为什么但是我在jdk上手动测试了它。 2^30-3 still throwing vm except
编辑:固定为-1至-4,已在Windows jvm上选中
答案 9 :(得分:0)
Java 数组有一个限制,因为它是一个整数数组,这意味着它在数组中最多有 2,147,483,647 个元素