05 数组¶
本章目标¶
- 理解数组:存储一组相同类型的数据
- 掌握数组的创建、访问、遍历
- 掌握二维数组
- 会用 Arrays 工具类
5.1 什么是数组?¶
数组是一组相同类型数据的容器。比如存 5 个玩家的分数,不用定义 5 个变量,一个数组搞定。
// 创建数组的两种方式
int[] scores = new int[5]; // 方式一:先指定长度,默认值 0
int[] levels = {1, 5, 10, 20}; // 方式二:直接给初始值
// 访问:下标从 0 开始
scores[0] = 100; // 给第 1 个元素赋值
System.out.println(scores[0]); // 100
System.out.println(levels[2]); // 10
下标从 0 开始!¶
int[] arr = {10, 20, 30};
// 下标: 0 1 2
System.out.println(arr[0]); // 10
System.out.println(arr[2]); // 30
System.out.println(arr.length); // 3(长度)
// System.out.println(arr[3]); // ❌ 数组越界!ArrayIndexOutOfBoundsException
越界是高频报错
访问 arr[arr.length] 一定是越界(最大下标是 length - 1)。循环遍历时要用 < arr.length,不是 <=。
5.2 遍历数组¶
普通 for¶
int[] scores = {88, 92, 60, 75, 100};
for (int i = 0; i < scores.length; i++) {
System.out.println("第" + (i + 1) + "个分数: " + scores[i]);
}
增强 for(只读遍历最方便)¶
for (int score : scores) {
System.out.println(score);
}
增强 for 不能修改元素
增强 for 里的 score 是副本,score = 999 不会改到数组。要改元素必须用下标方式。
5.3 常见操作¶
求最大值 / 求和¶
int[] arr = {3, 9, 7, 1, 5};
int max = arr[0];
int sum = 0;
for (int v : arr) {
if (v > max) max = v;
sum += v;
}
System.out.println("最大值: " + max); // 9
System.out.println("总和: " + sum); // 25
数组反转¶
int[] arr = {1, 2, 3, 4, 5};
for (int i = 0, j = arr.length - 1; i < j; i++, j--) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
// arr 变成 {5, 4, 3, 2, 1}
复制数组¶
int[] a = {1, 2, 3};
int[] b = a; // ❌ 只是引用同一个数组!改 b 会影响 a
int[] c = Arrays.copyOf(a, a.length); // ✅ 真正复制
5.4 Arrays 工具类¶
import java.util.Arrays;
int[] arr = {5, 2, 8, 1};
Arrays.sort(arr); // 排序 -> {1, 2, 5, 8}
Arrays.fill(arr, 0); // 全部填 0
Arrays.toString(arr); // "[0, 0, 0, 0]" 方便打印
Arrays.equals(a, b); // 比较两个数组内容是否相等
Arrays.binarySearch(arr, 5); // 二分查找(需先排序),返回下标
5.5 二维数组¶
// 3 行 2 列
int[][] grid = new int[3][2];
grid[0][0] = 1;
grid[0][1] = 2;
// 直接初始化
int[][] map = {
{1, 0, 1},
{0, 1, 0},
{1, 1, 0}
};
// 嵌套循环遍历
for (int i = 0; i < map.length; i++) {
for (int j = 0; j < map[i].length; j++) {
System.out.print(map[i][j] + " ");
}
System.out.println();
}
模组里的二维数组
自定义结构的方块布局、小地图数据、地形生成模板都常用二维数组存。
5.6 数组的局限与替代¶
- 数组长度固定,不能动态增删
- 需要动态增删元素时,用
ArrayList(第 11 章集合框架会讲)
List<Integer> list = new ArrayList<>(); // 可动态增删
list.add(1);
list.add(2);
list.remove(0);
5.7 小练习¶
- 定义数组
{5, 12, 8, 20, 3},找出最小值并打印下标 - 把数组元素全部翻倍(用下标方式修改)
- 二维数组:打印一个 5×5 的"乘法表"数字阵
- 统计数组里有多少个偶数
本章小结¶
- 数组下标从 0 开始,遍历用
< arr.length - 越界报错 ArrayIndexOutOfBoundsException
- 增强 for 只读,改元素用下标
- Arrays 提供排序/复制/填充工具
- 动态集合用 ArrayList(下一章之后会细讲)
下一章:06 方法