Java多维数组的内存分配

什么是多维数组

多维数组的本质还是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课》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值