数组是 Java 里最基础的数据结构:一块连续内存装着一组相同类型的值,通过下标访问,速度极快。实际项目里虽然更多用 List,但数组是绕不开的基础。

声明与初始化

Java 数组有三种常见写法:先声明后赋值、声明时直接给元素、用 new 指定长度。

// 方式一:静态初始化,直接给出所有元素
int[] scores = {90, 85, 77};

// 方式二:动态初始化,指定长度,元素是默认值
int[] arr = new int[3];
arr[0] = 10;
arr[1] = 20;
arr[2] = 30;

System.out.println(scores[0]);  // 90
System.out.println(arr.length); // 3

注意:new int[3] 创建后元素是默认值,int 是 0,boolean 是 false,对象类型(比如 String)是 null。

访问元素与越界问题

下标从 0 开始,最大到 length - 1。越界访问不会自动容错,会直接抛异常。

int[] scores = {90, 85, 77};

System.out.println(scores[1]);     // 85
scores[1] = 88;                    // 修改元素
System.out.println(scores[1]);     // 88

// System.out.println(scores[3]);  // ArrayIndexOutOfBoundsException

length 是数组的属性(不带括号),别和字符串的 length() 方法、集合的 size() 方法搞混。

遍历:for 与 for-each

普通 for 循环能拿到下标,适合需要改元素或知道位置的场景;for-each 更简洁,只读元素时优先用它。

String[] langs = {"Java", "Python", "Go"};

// 普通 for:有下标
for (int i = 0; i < langs.length; i++) {
    System.out.println(i + ": " + langs[i]);
    // 0: Java
    // 1: Python
    // 2: Go
}

// for-each:只要元素本身
for (String lang : langs) {
    System.out.println("hello " + lang);
}

一个小陷阱:for-each 里改循环变量不会影响数组本身,需要修改元素时请用普通 for。

二维数组

二维数组就是「数组的数组」,最常见的是表格状的矩形数组。

int[][] matrix = {
    {1, 2, 3},
    {4, 5, 6}
};

System.out.println(matrix[1][2]);   // 6,第 2 行第 3 列
System.out.println(matrix.length);      // 2,行数
System.out.println(matrix[0].length);   // 3,列数

遍历二维数组要嵌套 for:外层循环走行、内层循环走列。

Arrays 工具类:打印、排序与复制

java.util.Arrays 是操作数组的官方工具箱,最常用的三个方法是 toString()、sort() 和 copyOf()。

import java.util.Arrays;

int[] nums = {5, 2, 8, 1};

// 直接打印数组名只会得到内存地址,要用 toString()
System.out.println(nums);                    // 类似 [I@1b6d3586
System.out.println(Arrays.toString(nums));   // [5, 2, 8, 1]

// 排序(直接修改原数组)
Arrays.sort(nums);
System.out.println(Arrays.toString(nums));   // [1, 2, 5, 8]

// 复制:新数组长度为 6,多出的位置补 0
int[] bigger = Arrays.copyOf(nums, 6);
System.out.println(Arrays.toString(bigger)); // [1, 2, 5, 8, 0, 0]

直接打印数组名得到的 [I@1b6d3586 是内存地址不是内容,想看内容永远用 Arrays.toString()。

小结

  • 数组声明用 int[] arr = {...} 静态初始化,或 new int[n] 动态初始化(元素为默认值)
  • 下标从 0 开始,越界抛 ArrayIndexOutOfBoundsException;长度用 arr.length
  • 只读遍历用 for-each,需要下标或修改元素用普通 for
  • 二维数组是数组的数组,matrix.length 是行数、matrix[0].length 是列数
  • 打印数组内容用 Arrays.toString(),排序用 Arrays.sort(),复制用 Arrays.copyOf()

数组练熟之后,下一步可以对比着学 List,下一篇展开讲。