🌟 想系统化学习 Java 编程?看看这个:[编程基础] Java · 学习手册
0x01:数组类型 — 概念引入
我们以一个需求,来导入 Java 的数组类型。比如录入 5 个学生的成绩,并求其平均值,我们可以这样写:
import java.util.Scanner;
public class TestVar {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int total = 0; // 总分
for (int i = 0; i < 5; i++) {
System.out.print("请录入第 " + (i + 1) + " 个学生的成绩: ");
total +=sc.nextInt();
}
System.out.println("5 名学生的平均分为: " + (total / 5));
}
}
OK,平均值是能求了,那么我想知道第 3 个学生的成绩是多少,你能给我输出出来吗?还不能吧。所以这就引出了本章我们将要介绍的数据类型 ”数组“,它就可以帮我们存储每个学生的具体的成绩。
0x02:数组类型 — 概念解析
数组是指一组类型相同的数据的有序集合。数组描述的是相同类型的若干个数据,按照一定先后次序排列组合而成的一种结构。其中,每一个数据都可以被称作是一个元素,每个元素都可以通过一个索引(下标)来访问它们。
数组的四个基本特点如下:
-
数组的长度是固定的: 数组一旦被创建,其大小就不能发生改变。
-
数组中的元素类型必须一致: 数组中的元素必须是同一类型的,不允许出现混合类型。
-
数组类型可以是任何数据类型: 数组可以是任意数据类型,包括基本数据类型和引用类型。
-
数组有索引: 数组是有索引的,通过索引我们可以定位某一个元素的内容。索引是从 0 开始,到
数组.length -1
结束。 -
数组变量属于引用类型,数组也是对象的一种: 数组中的每个元素相当于该对象的成员变量。数组本身就是一个对象,Java 对象是在堆中的,因此数组无论保存原始类型还是其他对象类型,数组对象本身还是在堆中存储数据的。
0x03:数组类型 — 数组的简单使用
0x0301:数组的声明 & 创建
一个数组由 4 个基本元素构成:数组名称,数组元素、元素索引、数据类型。在 Java 中,声明数组的方式如下:
数据类型[] 数组名;
数组名 = new 数据类型[长度];
-------------------------> 例
int[] x; // 声明一个 int[] 类型的变量
x = new int[100]; // 为数组 x 分配 100 个元素空间
为了方便获得数组的长度,Java 提供了一个 length 属性,在程序中可以通过“数组名.length
”的方式获得数组的长度,即元素的个数。看下面这个例子:
public class TestVar {
public static void main(String[] args) {
int[] arr; // 声明一个数组
arr = new int[10]; // 给数组开辟一个长度为 10 的空间
// 打印数组的长度
System.out.println(arr.length);
}
}
0x0302:数组的初始化 & 元素赋值
1. 默认初始化
当数组被成功创建后,如果没有给数组元素赋值,则数组中的元素会被自动赋予一个默认值,根据元素类型的不同,默认初始值也是不一样的,见下表:
数据类型 | 默认初始值 |
---|---|
byte short int long | 0 |
float double | 0.0 |
char | 一个空字符,即'\u0000' |
boolean | false |
引用数据类型 | null ,表示变量不引用任何对象 |
2. 静态初始化
静态初始化,就是在定义数组的同时为每个元素赋值:
类型[] 数组名 = new 类型[]{元素, 元素, ...}; // 不可以写成 int[] a = new[4]{1, 2, 3, 4}; 编译器会认为数组限定的元素个数[4]与实际存储的元素{1, 2, 3, 4}个数有可能不一致,存在一定的安全隐患。
类型[] 数组名 = {元素, 元素, ...};
看下面这个案例:
public class TestVar {
public static void main(String[] args) {
int[] arr = new int[]{10, 20, 30, 40};
// 打印数组的长度
System.out.println(arr.length);
int[] arr2 = {50, 60, 70, 80, 90};
//打印数组的长度
System.out.println(arr2.length);
}
}
3. 动态初始化
动态初始化,就是将为数组元素分配空间和赋值的操作分开进行。看下面这个案例(赋值时需要指定下标,数组的下标是从 0 开始算的):
public class TestVar {
public static void main(String[] args) {
int[] arr;
arr = new int[3];
// 赋值
arr[0] = 1;
arr[1] = 2;
arr[2] = 3;
System.out.println(arr[2]); // 打印 arr[2] 元素的值
}
}
在上面那个案例中,我们创建了一个包含 3 个元素的 int 型数组,其下标范围为 0 ~ 2,问题来了,假设我给下标为 3 的元素赋值,会发生什么呢?
public class TestVar {
public static void main(String[] args) {
int[] arr;
arr = new int[3];
// 赋值
arr[0] = 1;
arr[1] = 2;
arr[2] = 3;
arr[3] = 4;
System.out.println(arr[2]); // 打印 arr[2] 元素的值
}
}
💥 Bug:数组索引越界
数组是一个容器,存储到数组中的每个元素都有自己的自动编号,最小值为 0,最大值为数组长度减 1,如果要访问数组存储的元素,必须依赖于索引。在访问数组的元素时,索引不能呢个超出 0 - length-1 的范围,否则程序会报错。
在使用变量引用一个数组时,变量必须指向一个有效的数组对象。如果该变量的值为 null,则意味着没有指向任何数组,此时通过该变量访问数组的元素会出现空指针异常。
0x0303:数组的使用
创建数组,并且为数组的元素赋值后,我们就可以使用数组啦。我们可以取出数组中任意下标的元素,并且进行后续的处理:
public class TestVar {
public static void main(String[] args) {
int[] arr = {10, 20, 30, 40};
System.out.println("arr 数组的总长度为: " + arr.length);
System.out.println("arr 数组中下标为 0 的元素为: " + arr[0]);
System.out.println("arr 数组中下标为 1 的元素为: " + arr[1]);
System.out.println("arr 数组中最后一个元素的值为: " + arr[arr.length - 1]);
}
}