Java数组的长度到底能有多大

Python09

Java数组的长度到底能有多大,第1张

不同平台,不同环境,有不同结果

。。。。。。。。。

使用eclipse默认的vm arguments,运行以下代码:

public static void main(String[] args) {

byte[] array=new byte[61858764]

// short[] shortArray=new short[30929382]

// int[] intArray=new int[15464691]

// long[] longArray=new long[7732345]

}

成功,没有报错,可知在eclipse默认的vm arguments下,byte数组最大长度是61858764,将近60M。

由于short的长度比byte大一倍,所以short数组的最大长度是30929382,是byte数组最大长度的一半,

以此类推,int数组最大长度是15464691,long数组最大长度是7732345

我以为这就是最终结果,后来突然想起修改虚拟机的最大内存,也是这个结果吗?

我把eclipse的vm arguments设置修改为:-Xms256M -Xmx768M

再次测试代码,发现byte数组的最大长度可以更长,

通过Windows任务管理器可知,运行代码的javaw.exe进程占用的内存也更大(废话,呵呵)

到此为止,应该可以得出结论,通过修改虚拟机的最大内存,java整型数组的最大长度可以很长,但到底有多长?(肯定比内存小)

我试过定义一个byte数组的长度为618587640,将近600M,没有报错,更长的数组似乎没有意义,我也没有测试。

java 中数组的最大长度是多少呢?看一下它的length属性就可以了。length属性是32位的有符号整数,它的最大值是2的31次幂,就是2G。为何有这个限制呢?为什么length的属性不是long型呢?我们假设一下,如果它是long型的,那么它的最大长度是2的63次幂。内存永远也不会有那么大吧。即使是字节数组长度是int的,最大长都达到2GB.

由此想到了String,这个家伙底层也是基于数组的,是一个字符数组。字符是16位的基本类型,一个String的最大长度是多少呢?就是字符数组的最大长度也是2G,占用内存是4GB。

从JVM的角度来解释:创建数组的字节码是anewarray和newarray,操作数栈的字宽是32位,而这两个字节码的参数都是一个字长,所以无法接受long型的长度参数。不知道这样解释是否很牵强。