什么是多维数组
多维数组的本质还是1维数组,就是数组元素依然是数组的1维数组,比如2维数组是数组元素是1维数组的数组,3维数组是数组元素是2维数组的数组…….以此类推,N维数组是数组元素是N-1维数组的数组。
示例代码(下面的代码只是为了讲解多维数组在内存的分配机制,实际中不会写出这么绕的多维数组)
public class ObjectArrayTest{
public static void main(String[] args) {
//定义并初始化一个Object类型的数组
Object[] objectArr=new Object[3];
//让objectArr数组第二个元素指向一个长度为2的Object类型数组
objectArr[1]=new Object[2];
//将objectArr[1]的值赋给objectArr2,实际是让objectArr[1]和objectArr2一同指向上面那个长度为2的Object类型数组
Object[] objectArr2=(Object[])objectArr[1];
//让objectArr2所引用数组的第二个元素指向一个长度为3的Object类型数组
objectArr2[1]=new Object[3];
//将objectArr2[1]的值赋给objectArr3,实际是让objectArr2[1]和objectArr3一同指向上面那个长度为3的Object类型数组
Object[] objectArr3=(Object[]) objectArr2[1];
//让objectArr3所引用数组的第二个元素指向一个长度为5的int类型数组
objectArr3[1]=new int[5];
//将objectArr3[1]的值赋给iArr,实际是让objectArr3[1]和iArr一同指向上面那个长度为5的int类型数组
int[] iArr=(int[]) objectArr3[1];
//依次给iArr所引用数组的每个元素赋值
for(int i=0;i<iArr.length;i++)
{
iArr[i]=i*2+1;
}
//直接通过objectArr数值去访问iArr数组的第二个元素
System.out.println(((int[])((Object[])((Object[])objectArr[1])[1])[1])[1]);
}
}
执行结果
内存分配分析
1、当执行下面语句后
Object[] objectArr=new Object[3];
objectArr[1]=new Object[2];
系统在栈内存定义一个objectArr引用变量指向一个长度为3的数组对象,该数组对象的第2个元素(即objectArr[1])再次指向一个长度为2的数组对象,此时的内存分配如下图
此时的objectArr可以看成2维数组
2、当执行下面语句后
Object[] objectArr2=(Object[])objectArr[1];
系统在栈内存又定义一个objectArr2引用变量,由于将objectArr[1]的值赋给objectArr2,让objectArr2和objectArr[1]一同指向上面那个长度为2的Object类型数组对象,此时的内存分配如下图
3、当执行下面语句后
objectArr2[1]=new Object[3];
objectArr2所引用数组的第二个元素再次指向一个长度为3的Object类型数组,此时的内存分配如下图
此时的objectArr2可以看成2维数组,objectArr可以看成3维数组
4、当执行下面语句后
Object[] objectArr3=(Object[]) objectArr2[1];
系统在栈内存又定义了一个objectArr3引用变量,由于objectArr2[1]的值赋给objectArr3,让objectArr3和objectArr2[1]一同指向上面那个长度为3的Object类型数组对象,此时的内存分配如下图
5、当执行下面语句后
objectArr3[1]=new int[5];
objectArr3所引用数组的第二个元素再次指向一个长度为5的int类型数组,此时的内存分配如下图
6、当执行下面语句后
int[] iArr=(int[]) objectArr3[1];
由于objectArr3[1]的值赋给iArr,让iArr和objectArr3[1]一同指向上面那个长度为5的int类型数组对象,此时的内存分配如下图
此时的objectArr3可以看成2维数组,objectArr2可以看成3维数组,objectArr可以看成4维数组,也就是
小结
通过上面的分析,多维数组本质还是1维数组,在使用数组的同时也应该多从内存分配机制的角度把握程序。
参考:《疯狂java 突破程序员基本功的16课》