1. 数组概述
1.1 数组的理解
数组(Array),是多个相同数据类型按一定顺序排列的集合,并由一个变量所管理
1.2 数组的相关概念
- 数组名:即用来声明数组的变量名
- 元素:数组中所包含的数据的统称
- 索引(又叫角标、下标):数组中元素的位置,从0开始依次递增
- 长度:即数组中元素的个数
1.3 数组的特点
- 数组是有序排列的
- 数组属于引用类型变量。但是数组的元素既可以是基本数据类型,也可以是引用数据类型。
- 创建数组对象时会在内存中开辟一块连续的空间
- 数组的长度一旦确定,则无法更改。若实际使用中需要进行长度变更,则需要重新创建一个数组。
1.4 数组的分类
- 按维度:一维数组、二维数组、三维数组。。。。。。
- 按数组元素类型:基本数据类型的数组、引用数据类型的数组。
2. 一维数组
2.1 一维数组的声明与初始化
静态初始化:初始化时直接对元素进行赋值:
int[] arr = new int[]{1, 2, 3, 4, 5}; int[] arr2 = {1, 2, 3, 4, 5};//由于new int[] 是固定的,故可以省去(Java 类型推断机制)
动态初始化:数组初始化与赋值操作分开进行
int[] arr3 = new int[5]; arr3[0] = 1; String[] arr4 = new String[5]; arr4[3] = "coding";
2.2 一维数组元素的引用
数组中元素通过角标的形式进行调用,角标从0
开始,到数组长度-1
结束
arr[0] = 1;
arr[1] = 2;
arr[2] = 3;
arr[3] = 4;
arr[4] = 5;
2.3 一维数组的属性:length
System.out.println(arr.length);
注意:数组一旦初始化,其长度就是固定的
2.4 一维数组的遍历
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
2.5 一维数组元素的默认值
数组的第二种初始化方式中,由于预先划分好了数组的空间,但是并没有对元素进行赋值,故存在默认值问题。一维数组初始化时各个类型元素的默认值如下:
- 整型:
0
- 浮点型:
0.0
- 布尔型:
false
- 引用类型:
null
记忆技巧:不管是哪种类型元素,在初始化时都会将内存中的二进制位置0
,反应成具体的数据类型即为上述内容。要注意引用类型默认是null,不可以直接进行使用。
2.6 一维数组内存结构
如图所示,数组声明时会在栈中分配一块空间,用于存储数组第一个元素在堆中的首地址。若使用静态初始化方式,则先在栈中开辟一块空间,然后在堆中分配对应的元素存放区域,将栈中开辟的空间的值设为首元素的地址,类似于C中的指针。若使用动态初始化,则没有为元素赋值这一步,直接分配空间后使用其默认值。
3. 二维数组
理解:数组属于引用数据类型,由于数组的元素也可以是引用数据类型,则如果一个数组的所有元素都是一个一维数组,那么这个数组可以称为二维数组。
2.1 二维数组的声明与初始化
静态初始化
int[][] arr = new int[][] { { 1, 2, 3 }, { 4, 5 }, { 6, 7, 8 } }; int[][] arr1 = { { 1, 2, 3 }, { 4, 5 }, { 6, 7, 8 } };
动态初始化
// 方式1 int[][] arr2 = new int[3][2]; // 方式2 int[][] arr3 = new int[3][];// 列的元素个数可以省略
2.2 二维数组元素的引用
二维数组的每一个维度都通过索引进行引用,与一维数组一样,都是从0开始
System.out.println(arr1[0][2]);// 先行后列
System.out.println(arr2[1][2]);
2.3 二维数组的属性:length
System.out.println(arr.length);// 行数
System.out.println(arr[i].length);// 第 i 行元素个数,即二维数组中第i个数组的长度
2.4 二维数组的遍历
for (int i = 0; i < arr3.length; i++) {
for (int j = 0; j < arr3[i].length; j++) {
System.out.print(arr3[i][j] + "\t");
}
System.out.println();
}
推论:数组维数越高,遍历时使用的循环嵌套层数就越高,且为一一对应关系,即几维数组就使用几层循环。
2.5 二维数组元素的默认值
假设二维数组的两个维度分别为外层数组和内层数组,对应的元素为外层元素和内层元素。
int[][] arr = new int[4][3];
中,外层元素为arr[0]
、arr[1]
等,内层元素为arr[0][3]
、arr[1][2]
等。则:
初始化方式一
int[] arr = new int[4][3]
:- 外层元素:地址值
- 内层元素:与一维数组初始化情况相同
初始化方式二
int[] arr = new int[4][]
:- 外层元素:null
- 内层元素:不可调用,会报空指针异常
2.6 二维数组内存结构
如图所示,声明一个二维数组时相当于声明了一个元素为地址类型的一维数组,每个元素的地址都指向另一个一维数组的首元素地址,因此二维数组本质上也是一个一维数组,只不过元素变成了其它的一维数组。