相信大家对数组都有了解,这里就不赘述太多基础性知识啦,直接写一些不熟悉或者重点的内容。
一维数组
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、基本数据类型转换(自动转换和强制转换)
Ⅲ、数组创建后,如果没有赋值,有默认值。
| 数据类型 | 默认值 |
|---|---|
| byte | 0 |
| short | 0 |
| int | 0 |
| long | 0 |
| float | 0.0 |
| double | 0.0 |
| char | \u0000 |
| boolean | false |
| String | null |
Ⅳ、数组下标从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=0 | j=1 | j=2 | |
|---|---|---|---|
| i=0 | 1 | ||
| i=1 | 2 | 2 | |
| i=2 | 3 | 3 | 3 |
(可以看到第一行有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(非广告),所以做个笔记仅供学习,文章虽标为原创,但大体思路是韩顺平老师的授课思路,在此基础上加上了自己的理解,不喜勿喷哦。

913

被折叠的 条评论
为什么被折叠?



