栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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出栈之后,堆空间里所有数组都会被回收

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/692983.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号