背景与动机
数组是 Java 里最基础的数据容器之一,适合保存一组同类型、固定长度的数据。
它最常见的使用场景就是:统计分数、保存编号、批量处理结果、做遍历和排序。
学数组时,重点不是只记住 int[] 怎么写,而是理解:
- 数组保存的是什么。
- 数组长度为什么固定。
- 下标为什么从
0开始。 - 遍历时为什么最容易写错边界。
核心原理拆解
1. 数组保存同类型元素
数组中的每个元素类型必须一致。
int[] numbers = {10, 20, 30};String[] names = {"Tom", "Jerry"};如果需要保存不同类型的数据,通常要改用对象、集合或其他结构,而不是强行塞进数组。
2. 数组长度固定
数组创建完成后,长度就不能再变了。
int[] scores = new int[3];这里 scores 的长度永远是 3,不能中途扩容成 4 或 5。如果你需要动态增长,通常应该用 ArrayList。
3. 数组有默认值
使用 new 创建数组时,元素会自动得到默认值。
int[] a = new int[3]; // {0, 0, 0}boolean[] flags = new boolean[2]; // {false, false}String[] words = new String[2]; // {null, null}这也是数组和手动创建变量不一样的地方:数组对象创建后,就已经有了可预测的初始状态。
4. 数组下标从 0 开始
int[] numbers = {10, 20, 30};System.out.println(numbers[0]); // 10System.out.println(numbers[2]); // 30长度为 3 的数组,合法下标是 0、1、2。
访问 numbers[3] 会直接越界。

5. 数组本身也是对象引用
数组变量里存的不是所有元素本身,而是数组对象的引用。
int[] arr = new int[3];int[] other = arr;other[0] = 99;
System.out.println(arr[0]); // 99这说明 arr 和 other 指向的是同一个数组对象。
6. 遍历数组常用两种写法
普通 for 适合需要下标的场景:
for (int i = 0; i < numbers.length; i++) { System.out.println(numbers[i]);}增强 for 适合只关心元素值的场景:
for (int number : numbers) { System.out.println(number);}7. 常用数组工具类
java.util.Arrays 提供了很多实用方法:
import java.util.Arrays;
int[] numbers = {3, 1, 2};System.out.println(Arrays.toString(numbers)); // [3, 1, 2]Arrays.sort(numbers);System.out.println(Arrays.toString(numbers)); // [1, 2, 3]最小可运行代码示例
import java.util.Arrays;
public class ArrayDemo { public static void main(String[] args) { int[] numbers = {10, 20, 30}; int[] copy = Arrays.copyOf(numbers, numbers.length);
System.out.println(numbers[1]);
for (int i = 0; i < numbers.length; i++) { numbers[i] += 1; }
System.out.println(Arrays.toString(numbers)); System.out.println(Arrays.toString(copy)); }}输出中,numbers 被改了,copy 还是原来的内容,因为 Arrays.copyOf 创建了新数组。
常见陷阱与错误示例
1. 数组下标越界
错误示例:
int[] arr = {1, 2, 3};System.out.println(arr[3]);数组长度是 3,最大下标是 2。访问 arr[3] 会抛出 ArrayIndexOutOfBoundsException。
2. 误以为数组长度能改
int[] arr = new int[3];这不是一个能自动扩容的容器。要动态增长,请考虑 ArrayList。
3. 用 == 比较数组内容
int[] a = {1, 2};int[] b = {1, 2};System.out.println(a == b); // false== 比较的是引用,不是内容。数组内容比较通常要用 Arrays.equals(a, b)。
4. 在循环里写错边界
i <= arr.length 会多走一步,正确写法通常是 i < arr.length。
面试高频问题
1. 数组的长度能改变吗
不能。Java 数组长度固定,创建后不能扩容或缩容。
2. 数组和 ArrayList 有什么区别
数组长度固定,适合大小已知的场景;ArrayList 可以动态增长,更适合不确定长度的数据。
3. 数组默认值是什么
基本类型数组是对应类型的零值,比如 int 是 0、boolean 是 false;引用类型数组默认值是 null。
4. 数组和普通变量有什么不同
数组变量保存的是数组对象的引用,不是所有元素本身。
一句话总结
数组是固定长度的同类型数据容器,最重要的是记住下标从 0 开始、长度不可变、越界会报错。