黑马程序员技术交流社区

标题: 关于内存结构和二维数组的疑惑 [打印本页]

作者: 刘学宾    时间: 2012-10-27 10:48
标题: 关于内存结构和二维数组的疑惑
1,我们都知道,堆区存储的全部是对象和数组。而栈区存储的是基础数据类型的对象和对象的引用。,
2,我们又知道,二维数组的对象存在堆区,如创建二维数组 int[][] arr = new int[3][] ; 然后我们对这个
      数组中的3个一维数组进行初始化,如arr[0] = new int[3];arr[1] = new int[1];arr[2] = new int[2];  这样
      便在堆区新开辟了三个一位数组的空间,而arr[0]、arr[1]和arr[3]是这三个一位数组的引用。
我的问题是这三个引用(即arr[0]、arr[1]和arr[3])是存储在堆区中的,而不是存储在栈区中的。
这样岂不违背了第1句话?(上述文字也许是我存在误解,请大牛们解释一下)



二维数组存储.jpg (65.87 KB, 下载次数: 17)

上个图,这是毕老师讲数组视频的一个关于二维数组存储空间的截图。

上个图,这是毕老师讲数组视频的一个关于二维数组存储空间的截图。

作者: 范贞亮    时间: 2012-10-27 11:44
java中没有像其他语言一样,有多维数组的类型,是因为java的多维数组都是看作数组的数组,比如说二维数组看作是一维数组的数组,即在一维数组中放数组。其他的同理。
一般只要在定义时候规定了第一个数组的维数就可以了,比如int [][] a = new int [2][];后面的不指定维数,java虚拟机就能运行成功。
int [][] a= new int [2][];可以写成 int[] a[] = new int [2][];也就是在a[]数组中放int[]数组。
此时在内存中就会先分配两块内存空间,而不会去管每一块里面如何再去分配,那是每一块内存自己的事。所以不是连续分配成连续的4个int空间,而是先创建2个int[]空间。然后每一个int[]空间再分别分配。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2