13、数组(一维、二维用图形化的方式解析内存空间)

相信大家对数组都有了解,这里就不赘述太多基础性知识啦,直接写一些不熟悉或者重点的内容。

一维数组

1、初始化的方式

①数据类型 数组名[ ] = new 数据类型[ 大小 ]

int a[] = new int[5];
//等价于
int []a = new int[5];

②先声明,后分配空间

int a[];			//或者 int []a,这里是先声明一个a数组,但是还没有分配内存空间
a = new int[5];		//用new分配空间

③数据类型 数组名[ ] = {元素值,元素值…}

int a[] = {1,2,3,4,5,6}

还有一种特别的形式:

int a[] = new int[]{0,1,2,3,4,5};		//这种也是初始化的一种方式

//这是错误的,不能在new int[]里面加上具体的数量,要让编译器自己判断有多少个元素
int b[] = new int[6]{0,1,2,3,4,5};		

2、使用细节

Ⅰ、数组是多个相同类型数据的组合,实现对这些数据的统一管理。
Ⅱ、数组中的元素可以是任何数据类型,包括基本数据类型和引用类型,但是不能混用。

int a[] = {1,2,3,4,5};		//里面的数组元素只能是整型
int b[] = {1,'a'};			//正确,char -> int可以自动转换
int c[] = {1,true};			//错误,Boolean只有false和true,没有0/1,不参与类型转换

对自动转换还不了解的可以看看这一篇文章:8、基本数据类型转换(自动转换和强制转换)

Ⅲ、数组创建后,如果没有赋值,有默认值。

数据类型默认值
byte0
short0
int0
long0
float0.0
double0.0
char\u0000
booleanfalse
Stringnull

Ⅳ、数组下标从0开始,而且得在指定范围,不要越界。

Ⅴ、数组属于引用类型,数组型数据是对象。
这点理解其实很简单,我们把int [ ]看作一个整体,近似于一种引用类型,而我们创建的数组a,b其实就是对象。

3、⭐数组赋值机制

基本数据类型和引用数据类型在JVM内存空间的方式是不一样的。
①基本数据类型赋值,变量指向的就是这个具体值。
②引用数据类型赋值,变量指向的是一个地址。

通过例子了解一下吧:

//基本数据类型
int a = 1;
int b = 2;

//引用数据类型:数组
int[] arr = {0,1,2};

在内存中的示意图:
在这里插入图片描述
(tip:虽然箭头指向的是蓝色的框框,但实质指向的是arr[0],因为arr对象指向的是数组首元素的位置,即arr[0]的地址是0x0011,学过的朋友们应该不难理解吧😁)请添加图片描述

关于里面的堆栈、方法区以后再介绍,现在就直接加一点点小记忆进行理解吧。我们只需要明白,数组arr对象指向的是一个地址,跟随着这个地址可以找到数组的各个元素即可。

对了,下面的语句意味着将arr2对象指向的值也为0x0011,和arr指向的是同一个地址,所以对arr2的操作也会影响arr,对arr的操作也会影响arr2。

int[] arr2 = arr;

在这里插入图片描述
 
 

二维数组

二维数组其实相当于在一维数组的基础上,将一维数组里面的每个元素用一个一维数组代替。
在这里插入图片描述

1、初始化方式

①数据类型[ ][ ] 数组名 = new 数据类型[ 行数 ][ 列数 ]

int arr[][] = new int[2][3];
arr[1][1] = 8;

上内存图:
在这里插入图片描述
二维数组看起来比一维数组的内存图复杂一点,大家可以把二维数组想象成:一维数组对象里面嵌套了一个一维数组对象 -----> 最外层的一维数组通过地址0x0011,找到了存储在该地址的arr[0],非常碰巧,arr[0]里面的元素也是个一维数组对象,那么把该对象的地址0x0033存储在arr[0]里面,在通过0x0033去找到arr[0][1]即可,里面的一维数组依然遵守一维数组的存储规则。

一定要注意:数组对象里面存储的地址指向的是第一个元素的地址,即指向第一个元素。
感觉写的不是很好,尽力了朋友们,看图尽量理解吧!!!可推广到三维、四维哦。请添加图片描述

②先声明,再分配空间

int [][]a;
a = new int [2][3];		//和一维数组一样啦。

列数不确定(即二维数组列数可以不相同)
举例:将下面的数组输出出来

j=0j=1j=2
i=01
i=122
i=2333

(可以看到第一行有1个元素,第二行有2个元素,第三行有3个元素)
上代码:
在这里插入图片描述
结果:
在这里插入图片描述
提示:
Ⅰ、int [ ][ ] arr = new int[3][ ]表示二维数组先确定了行数,在内存空间已经分配了最外层一维数组的空间,而arr[ i ] = new int[ i+1 ](粉红色代码)是对最里面的一维数组进行空间的分配,不要写错代码了。

Ⅱ、arr.length是算最外层一维数组的元素个数的(3个),arr[0].length是算arr[0]这个元素里面的一维数组的元素个数的,对照着图来看吧。

Ⅲ、在C语言中,二维数组的初始化可以省略行数,但不能省略列数;而在java中却是正好相反的,即列数可以省略,而行数是不能省略的。有兴趣看这个链接:C语言与java语言中关于二维数组的区别

④数据类型[ ][ ] 数组名 = {{元素值1,元素值2},{元素值…}}

int[][] arr = {{1,1},{1,2,3}};

小练习

好了,没啥要讲了,来点韩老师的小练习吧。
1、下列选项允许通过编译的是()

int[] x, y[];

a) x[0] = y;               b)y[0] = x;
c)y[0][0] = x;             d)x[0][0] = y;
e)y[0][0] = x[0];          f)x = y;

解析:
x是一维数组,而y是二维数组( int[] y[])
还有一个注意点:(赋值运算符是右边部分赋值给左边部分,不要弄错了)
a.int[][] -> int型数据
b.int[] -> int[]
c.int[] -> int型数据
d.int[][]> int型数据
e.int型数据 -> int型数据
f.int[][] -> int[]

2、

String color = "blue";
boolean[] bar = new boolean[2];
if(bar[0]){
	color = "green";
}
System.out.println(color);

解析:
输出“blue”,在一维数组部分写道,Java中数组若没有赋值,会有默认值。
boolean数组默认值为false,所以if判断不能进去,所以最终输出仍为blue。

本人正在B站跟着韩顺平老师学Java(非广告),所以做个笔记仅供学习,文章虽标为原创,但大体思路是韩顺平老师的授课思路,在此基础上加上了自己的理解,不喜勿喷哦。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

颜安青

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值