1、java二维数组内存解析过程
main方法中的代码如下:
(1) 第一行的执行情况:int[][] arr1= new int[4][];
- 左边运算:放在方法中的变量都叫做局部变量,故 “=”左侧的arr放在栈(stack)中
- 右边运算:“=”右侧的new结构,按照1中简化结构规则放在堆(heap)中; 故 int[4][]会再堆里申请4个连续的结构存值,为二维数组的外层元素(此时赋默认值null,由于此时申请的是int[]类型的);然后连续空间会有一个首地址值,假如为 0x1234
- 赋值运算:将地址0x1234赋值左侧栈空间变量arr1,所以arr1能够找到堆空间数组;完成了栈指向了堆;
图示例
(1) 第二行的执行情况:arr1[1] = new int[]{1,2,3};
- 左边运算:放在方法中的变量都叫做局部变量,故 “=”左侧的arr放在栈(stack)中
- 右边运算:“=”右侧的new结构,按照1中简化结构规则放在堆(heap)中; 故 int[]{1,2,3}会在堆里申请3个连续的结构存值,为二维数组的内层元素,(此时赋默认值0,由于此时申请的是int类型的);然后连续空间会有一个首地址值,假如为 0x7788
- 赋值运算:将二维数组堆内层元素的数据1,2,3地址0x7788赋值堆空间二维数组外层元素arr1[1],所以arr1[1]能够找到堆空间二维数组数据1,2,3
(3) 第3行的执行情况:arr1[2] = new int[4];
- 右边运算:“=”右侧的new结构,按照1中简化结构规则放在堆(heap)中; 故 new int[4]会在堆里申请4个连续的结构存值(此时赋默认值不确定);然后连续空间会有一个首地址值,假如为 0x6677
- 赋值运算:将一维维数组元素赋值给二维数组外层元素arr1[2],所以arr1[2]能够找到新申请的空间 int[4]首地址0x6677(因为是int[][]此时赋值0,由于此时申请的是int类型的)
(4) 第4行的执行情况:arr1[2][1] = 30;
- 赋值运算:30赋值给arr1[2][1]