Java数组可以包含的元素数量是否有限制?如果有,是什么?
当前回答
实际上有两个限制。第一,数组可索引的最大元素;第二,应用程序可用的内存量。根据可用内存量和其他数据结构使用的内存量,您可能会在到达最大可寻址数组元素之前达到内存限制。
其他回答
是的,java数组有限制。Java使用整数作为数组的索引,JVM存储的最大整数是2^32。你可以在数组中存储2147,483,647个元素。
如果你需要超过max-length,你可以使用两个不同的数组,但推荐的方法是将数据存储到一个文件中。因为在文件中存储数据是没有限制的。因为文件存储在存储驱动程序中,而数组存储在JVM中。JVM为程序执行提供了有限的空间。
数组是非负整数索引,因此可以访问的最大数组大小将是integer . max_value。另一件事是你可以创建多大的数组。这取决于JVM可用的最大内存和数组的内容类型。例如,每个数组元素都有它的大小。byte = 1字节,int = 4字节,对象引用= 4字节(在32位系统上)
因此,如果您的机器上有1 MB可用内存,您可以分配一个字节[1024 * 1024]或对象[256 * 1024]的数组。
回答你的问题-你可以分配一个数组的大小(最大可用内存/数组项的大小)。
总结-理论上数组的最大大小是Integer.MAX_VALUE。实际上,这取决于JVM有多少内存,以及有多少内存已经分配给了其他对象。
一个数组的最大元素数是(2^31)−1或2 147 483 647
通过这篇文章http://en.wikipedia.org/wiki/Criticism_of_Java#Large_arrays:
Java一直被批评不支持超过231 - 1(约21亿)个元素的数组。这是语言的局限性;Java语言规范第10.4节规定: 数组必须以int值为索引…访问数组的尝试 组件具有较长的索引值将导致编译时错误。
支持大型数组还需要对JVM进行更改。这种限制体现在一些方面,例如集合被限制在20亿个元素,以及无法内存大于2 GiB的映射文件。Java还缺乏真正的多维数组(通过单一间接方式访问连续分配的单个内存块),这限制了科学和技术计算的性能。
这(当然)完全依赖于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还没有真正的用途。)
推荐文章
- Java 8:我如何在流中使用异常抛出方法?
- 去下一次迭代在java For循环
- 在Java中使用什么数据类型来表示钱?
- Class.getResource()和ClassLoader.getResource()之间的区别是什么?
- 如何通过传递特定日期来确定星期几?
- 如何将DecimalFormat的小数分隔符从逗号更改为点/点?
- 控制jar工件的Maven最终名称
- Spring-MVC控制器中的404触发器?
- 为什么生成较长的serialVersionUID而不是简单的1L?
- JAX-RS / Jersey如何自定义错误处理?
- 在执行JpaTest时无法找到@SpringBootConfiguration
- _JAVA_OPTIONS, JAVA_TOOL_OPTIONS和JAVA_OPTS之间的区别
- 在java中转换字符到ASCII数字值
- 在Ubuntu上安装Java 7
- Jackson -使用泛型类反序列化