java 二维数组存储方式_JAVA-初步认识-第六章-二维数组-定义方式内存图解

一.

a802bd77e93714f47365963c1bdba78c.png

接下讨论数组中特殊的一部分。数组是一个容器,用来存储数据的。现在数组中存储的不再是int,double..的类型了,而是存储的数组。

数组中的元素还是数组,我们把它称之为数组中的数组,也就做二维数组。维度增加了一层。

二维数组的基本定义

65859e366be810443a4750c44d0a5982.png

b1e1fa4bd9eb804537df53d13b4a22c0.png(这个数组里面存放的还是数组)→

df556635e01ce3575ddd64fcb4e85aa6.png(最里面装的是int类型元素)

这就是定义了一个二维数组,但是数组需要长度,里面有几个一维数组。

12c493962ace03db0d46bec8d9f5ff59.png这个代表着有三个小箱子,每个小箱子里有两个小格子。这个书写的形式挺奇怪的。

对二维数组的定义的理解:先通过new创建一个数组new [],接着数组中装的元素也是数组new [][],数组里装的数组里面的元素是int类型,new int[][],然后每一个数组都有固定的长度。二维数组要明确数组里面装了几个数组,每个数组里有几个元素,new int[3][2]。为了操作创建好的数组,给它命名arr=new int[3][2], 名字叫arr的变量是什么类型?元素为int类型的二维数组类型 int [][] arr=new int[3][2]。

这里还有一点要注意的就是格式问题,数组的符号[]可以移动,三种写法都可以,int[][] arr,int[] arr[],int arr[][]。

二. 二维数组的应用

打印二维数组是什么样的?

55f935748c24f8a04abe96e1a240429e.png

1ec043b28168f53f293289c72572616f.png

对于二维数组而言,arr[0]代表的是二维数组里的第一个一维数组。

现在我们想操作二维数组中的第一个一维数组里的0角标元素。

03f54e071a757fd1c874ea19cffe41e3.png

连续两个数组符号[],它们分别代表的含义是不同的。第一个数组符号[]代表的是第几个一维数组,第二个数组符号里面的数字代表的是某个一维数组中的第几位元素。arr[0][0]代表的是二维数组中第0位数组中的第0位元素。

这里有一点,二维数组的输出arr[0]打印出来的内容是什么样的?

先介绍二维数组在内存中的图解。

688947c2a895282f2bf12d174f53e6dc.png

34349cf3aee7687500f1e0fb86103d95.png

首先,arr在函数中,属于局部变量,在栈中。右边式子中有new新建的数组,因此其在堆中开辟内存空间。之所以两者分开了存储,就在于它们之间是一个引用的关系,和直接用常量赋值变量int a=4的方式不一样,堆中的对象是靠的编号的,它把编号给栈中的变量,靠这个编号两者之间搭上关系。

7a41111e6c528ec28328fbf988619816.png

对于二维数组的分析是一步步来的,以new int[3][2]为例,先明确二维数组的长度,二维数组的长度为3,上面截图中的虚线格子代表就是一维数组,0,1,2代表的是二维数组的长度是3,每一个里面角标里面都是一个一维数组。

94b3119e6daf9aa5d3babc88c21a41aa.png

上面的截图体现了二维数组在内存中分布的意思,但是这么画是错误的。开辟一个空间出来,0是由默认初始化的值,那这里面是什么?它这里本身就应该存数组,如果没有数组,应该存什么?(),因为数组是实体,当没有实体时 ,引用型数据类型的默认值就是null(代表着没有任何指向)。int类型的默认值是0,double默认值是0.0。

519b1fece01d1fa66fbe3e2fc656ab65.png

任何一个实体,在堆内存中产生,它里面的数据都会进行默认初始化。这是系统自动完成的。接着问题就来了,一维数组在哪儿?

一维数组也是个实体,是要是实体,都要在堆内存中开辟空间,所以一维数组也要自己独立的开辟一个内存空间,同时分配了一个地址空间。接着把这个地址空间送入对应的位置。

a1c9eedd9f2a2bb7d9b1406572d036ee.png   

4c8396f5b34731a552bcda8f9941ef45.png

上面的右侧截图后,二维数组才真正的初始化完毕。紧接着二维数组把地址给arr,然后arr就可以指向二维数组。

31cc040f2f54624854b29b0e52337e5d.png

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值