日期:2014-05-20  浏览次数:20760 次

JAVA数组大小
int[][][] i=new int[2][3][4];
假设引用为32位;
是不是数组大小需要32*4个字节?
PS:在C++中需要24*4BYTES。JAVA由于是引用,不知理解是否有误。。。

------解决方案--------------------
"是不是数组大小需要32*4个字节?"

可以肯定的是,java数组不止这么多个字节

因为java数组是一个真正的对象,你可以调用数组的length属性,这个属性肯定要占用了空间

另外,对象头的mark-word(hotspot的对象实现)也要占用空间,指向方法区Class对象也要占用空间等等。。。
------解决方案--------------------
hotspot对象结构介绍:http://www.infoq.com/cn/articles/jvm-hotspot
------解决方案--------------------
对于1维数组来说,应该是连续的,就是指针数组,new的时候,应该是尽量保证连续的
但指针数组的元素指向的对象地址就没有必要保证连续了
如String[] s = new String[4]; //s的地址是连续的,4个32位的指针空间,而s[0],s[1]等等的地址就不是连续的,因为 s[?] = new String(xxx); 是可以改变数组元素的指向的,所以指向的对象是不连续的
在java里,2维数组就是1维数组的数组,也就是指针数组的数组,所以2维数组本身也是连续的,但它的元素指向的1维数组的地址就不一定连续了,如
String[][] s = new String[3]; //s的地址是连续的,但是s[0]..s[1]对象的地址不一定连续
而s[0] = new String[4]; //s[0]指向的数组对象的地址是连续的
其他维数依次类推 

所以int[][][] = new int[2][3][4]; 
首先1维int[2],是2个连续的地址(地址是指针类型)
然后 (int[2])[3],数组的数组,是3个连续的地址(地址类型是指针类型)
最后(int[2][3])[4],4个连续的数组,(地址是指针类型,指向4个元素的int数组对象)
所以int[2][3][4]是 2*3*4*(32位指针,4个byte) = 24 * 32,所以应该跟C的大小一样