java基础~二维数组内存解析

目录

二维数组 初始化值

二维数组内存解析

int arr1 = new int4;

arr1[1] = new int[]{1,2,3};

arr1[2] = new int[4]

arr12 = 30;


二维数组 初始化值

二维数组的使用:

  • 规定:二维数组分为外层数组的元素,内层数组的元素

    • int arr = new int4;

      • 外层元素:arr[0],arr[1]等

      • 内层元素:arr 0 ,arr1等

  • 数组元素的默认初始化值

    • 针对于初始化方式一:比如:int arr = new int4;

      • 外层元素的初始化值为:地址值

      • 内层元素的初始化值为:与一维数组初始化情况相同

    • 针对于初始化方式二:比如:int arr = new int4;

      • 外层元素的初始化值为:null

      • 内层元素的初始化值为:不能调用,否则报错。

public class ArrayTest3 {
    public static void main(String[] args) {
        
        int[][] arr = new int[4][3];
        System.out.println(arr[0]);//[I@15db9742 
        //[I@15db9742    [表示数组是一维的,@后面就是地址值
        System.out.println(arr[0][0]);//0
        
        System.out.println(arr);//[[I@6d06d69c
        //[[I@6d06d69c  [[表示数组是二维数组,@后面是地址值
        
        System.out.println("*****************");
        float[][] arr1 = new float[4][3];
        System.out.println(arr1[0]);//地址值
        System.out.println(arr1[0][0]);//0.0
        
        System.out.println("*****************");
        
        String[][] arr2 = new String[4][2];
        System.out.println(arr2[1]);//地址值
        System.out.println(arr2[1][1]);//null
        
        System.out.println("*****************");
        double[][] arr3 = new double[4][];
        System.out.println(arr3[1]);//null
//      System.out.println(arr3[1][0]);//报错
        
    }
}

二维数组内存解析

内存的简化结构

二维数组内存解析

int arr1 = new int4;

局部变量arr1入栈

new int4 在堆里开辟长度为4的二维数组,同时会有地址值0X1234

同时把地址值赋值给栈中局部变量arr1;

变量arr1指向堆中地址值为0X1234二维数组对象arr1

此时arr[0]的数值取决于arr1[0]元素的类型

而arr1[0]元素的类型为int型的一维数组,而且定义的时候是int4,并没有给内层元素的赋值,此时arr[0]的数值为null。

arr1[1] = new int[]{1,2,3};

通过栈中arr1变量找到堆中arr1[1]元素,因为没有对arr1[]进行初始化,所以arr1[0],arr1[1],arr1[2],arr1[3]都是null,

arr1[1] = new int[]{1,2,3};语句对arr1[1]进行初始化,

new int[]{1,2,3}在堆空间开辟长度是3的一维数组,地址值为0X7788,同时把地址值赋值给arr1[1]元素,赋值之前arr1[1]的值为null,赋值之后为0X7788,arr1[1]指向地址值为0X7788一维数组对象,此时地址为0X7788一维数组对象的元素为int类型,如果是动态初始化值就是0,但是语句采用静态初始化(数组的初始化和数组元素的赋值操作同时进行),所以地址为0X7788一维数组对象的第一个元素为1,第二个元素为2,第三个元素为3;

arr1[2] = new int[4]

同理,在堆空间中开辟长度是4的一维数组,地址值为0X6677,同时把地址值赋值给arr1[2]元素,赋值之前arr1[2]的值为null,赋值之后为0X6677,arr1[2]指向地址值为0X6677的一维数组对象,此时地址为0X6677一维数组对象的元素为int类型,语句才用的是动态初始化(数组的初始化和数组元素的赋值操作分开进行),所以地址为0X6677一维数组对象的第一个元素为0,第二个元素为0,第三个元素为0;

arr12 = 30;

先找到栈中局部变量arr1,通过arr1找到堆空间中地址值0X1234的二维数组arr1,通过arr1[2]角标找到,地址值为0X6677的一维数组对象,通过角标arr12 找到元素,把30赋值给元素。

语句执行完之后,就会退出方法,方法结束后,栈中局部变量arr1就会出栈,变量arr1出栈之后,堆空间里所有数组都会被回收

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值