java 中数组的最大长度是多少呢?看一下它的length属性就可以了。length属性是32位的有符号整数,它的最大值是2的31次幂,就是2G。为何有这个限制呢?为什么length的属性不是long型呢?我们假设一下,如果它是long型的,那么它的最大长度是2的63次幂。内存永远也不会有那么大吧。即使是字节数组长度是int的,最大长都达到2GB.
由此想到了String,这个家伙底层也是基于数组的,是一个字符数组。字符是16位的基本类型,一个String的最大长度是多少呢?就是字符数组的最大长度也是2G,占用内存是4GB。
从JVM的角度来解释:创建数组的字节码是anewarray和newarray,操作数栈的字宽是32位,而这两个字节码的参数都是一个字长,所以无法接受long型的长度参数。不知道这样解释是否很牵强。
有两种限制。
一是规范隐含的限制。Java数组的length必须是非负的int,所以它的理论最大值就是java.lang.Integer.MAX_VALUE = 2^31-1 = 2147483647。
二是具体的实现带来的限制。这会使得实际的JVM不一定能支持上面说的理论上的最大length。
例如说如果有JVM使用uint32_t来记录对象大小的话,那可以允许的最大的数组长度(按元素的个数计算)就会是:(uint32_t的最大值 - 数组对象的对象头大小) / 数组元素大小
于是对于元素类型不同的数组,实际能创建的数组的最大length也会不同。
JVM实现里可以有许多类似的例子会影响实际能创建的数组大小。
理论上的最大长度java.lang.Integer.MAX_VALUE = 2^31-1 = 2147483647。
个人觉得,32位长度是由对象在堆中所存储的数据结构决定的。对于数组对象,在对象头中有一个字(32位)表示数组的长度。