JAVA数组大小 int[][][] i=new int[2][3][4];假设引用为32位;是不是数组大小需要32*4个字节?PS:在C++中需要24*4BYTES。JAVA由于是引用,不知理解是否有误 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我在怀疑,数组元素的地址是否是连续的??因为JAVA根本没有必要向C++那样在运行时根据下标索引来计算。高手指点一下啊,谢谢 不清楚。个人觉得,既然选择用java了,就没有必要折腾内存之类的东西。 "是不是数组大小需要32*4个字节?"可以肯定的是,java数组不止这么多个字节因为java数组是一个真正的对象,你可以调用数组的length属性,这个属性肯定要占用了空间另外,对象头的-word(hotspot的对象实现)也要占用空间,指向方法区Class对象也要占用空间等等 hotspot对象结构介绍:http://www.infoq.com/cn/articles/jvm-hotspot 我知道,数组是一个特殊的类,算我没说清。我的意思是除了编译器添加的一些东西外,是不是对象还应当包括这32*4Byte,而不是24*4BYTES。如果答案是的话,那就说明多维数组并不一定连续,而且从下标索引到元素地址的计算方式与C++与完全不相同。 对于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的大小一样 你想的跟我一样的,感觉JAVA的多维数组更像是内存分页的组织形式;类似于C++中的指针数组;但JAVA其实只有一维数组,然后像链表一样,指向下一个数组,这样一级级传递下去;多维数组的形式只不过是语法糖罢了。可能你还没有理解我的意思,抑或是我没有表达清楚;24*4Bytes只是元素占用的空间,我问的是在堆中总共分配的空间;也就是通过栈上的变量i能够接触到的堆中的所有内存大小:应当加上8个引用的空间。当然,不算编译器添加的额外空间。因为C++中数组名就代表地址,也就是说C++的数组中指针不会占用额外的空间;只不过相对JAVA,计算量要大一些,因为通过下标访问数组需要计算;而JAVA可以直接取引用来得到; 不要去纠结这些问题,在内存中占用多少个 byte,不是统一的,由 JVM Vendor 确定! 正则表达式 取之间的部分 Java 游戏界面 你好 练习题,求高手代码,感谢!! 请问在公司里有一种叫做技术支持的是干什么的 如何使用jdk开发java程序(初级)100分,在线给分 我想学JAVA,可是不知道用什么工具,用什么教材可以上手最快,请指教:) 初级问题,这是为什么? 如何知道运行的平台是Windows还是Solaris? 一个算法的问题 大家好,请帮我看下我的这段代码怎么不能修改数据 JTextArea中文本问题
因为JAVA根本没有必要向C++那样在运行时根据下标索引来计算。
高手指点一下啊,谢谢
我的意思是除了编译器添加的一些东西外,是不是对象还应当包括这32*4Byte,而不是24*4BYTES。
如果答案是的话,那就说明多维数组并不一定连续,而且从下标索引到元素地址的计算方式与C++与完全不相同。
但指针数组的元素指向的对象地址就没有必要保证连续了
如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的大小一样
类似于C++中的指针数组;
但JAVA其实只有一维数组,然后像链表一样,指向下一个数组,这样一级级传递下去;
多维数组的形式只不过是语法糖罢了。可能你还没有理解我的意思,抑或是我没有表达清楚;
24*4Bytes只是元素占用的空间,我问的是在堆中总共分配的空间;
也就是通过栈上的变量i能够接触到的堆中的所有内存大小:应当加上8个引用的空间。
当然,不算编译器添加的额外空间。因为C++中数组名就代表地址,也就是说C++的数组中指针不会占用额外的空间;
只不过相对JAVA,计算量要大一些,因为通过下标访问数组需要计算;而JAVA可以直接取引用来得到;