跳转至

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 小练习

  1. 定义数组 {5, 12, 8, 20, 3},找出最小值并打印下标
  2. 把数组元素全部翻倍(用下标方式修改)
  3. 二维数组:打印一个 5×5 的"乘法表"数字阵
  4. 统计数组里有多少个偶数

本章小结

  • 数组下标从 0 开始,遍历用 < arr.length
  • 越界报错 ArrayIndexOutOfBoundsException
  • 增强 for 只读,改元素用下标
  • Arrays 提供排序/复制/填充工具
  • 动态集合用 ArrayList(下一章之后会细讲)

下一章:06 方法

🏠 返回总站