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

解决方案 »

  1.   

    我在怀疑,数组元素的地址是否是连续的??
    因为JAVA根本没有必要向C++那样在运行时根据下标索引来计算。
    高手指点一下啊,谢谢
      

  2.   

    不清楚。个人觉得,既然选择用java了,就没有必要折腾内存之类的东西。
      

  3.   

    "是不是数组大小需要32*4个字节?"可以肯定的是,java数组不止这么多个字节因为java数组是一个真正的对象,你可以调用数组的length属性,这个属性肯定要占用了空间另外,对象头的-word(hotspot的对象实现)也要占用空间,指向方法区Class对象也要占用空间等等
      

  4.   

    hotspot对象结构介绍:http://www.infoq.com/cn/articles/jvm-hotspot
      

  5.   

    我知道,数组是一个特殊的类,算我没说清。
    我的意思是除了编译器添加的一些东西外,是不是对象还应当包括这32*4Byte,而不是24*4BYTES。
    如果答案是的话,那就说明多维数组并不一定连续,而且从下标索引到元素地址的计算方式与C++与完全不相同。
      

  6.   

    对于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的大小一样
      

  7.   

    你想的跟我一样的,感觉JAVA的多维数组更像是内存分页的组织形式;
    类似于C++中的指针数组;
    但JAVA其实只有一维数组,然后像链表一样,指向下一个数组,这样一级级传递下去;
    多维数组的形式只不过是语法糖罢了。可能你还没有理解我的意思,抑或是我没有表达清楚;
    24*4Bytes只是元素占用的空间,我问的是在堆中总共分配的空间;
    也就是通过栈上的变量i能够接触到的堆中的所有内存大小:应当加上8个引用的空间。
    当然,不算编译器添加的额外空间。因为C++中数组名就代表地址,也就是说C++的数组中指针不会占用额外的空间;
    只不过相对JAVA,计算量要大一些,因为通过下标访问数组需要计算;而JAVA可以直接取引用来得到;
      

  8.   

    不要去纠结这些问题,在内存中占用多少个 byte,不是统一的,由 JVM Vendor 确定!