Java 数组基础

背景与动机#

数组是 Java 里最基础的数据容器之一,适合保存一组同类型固定长度的数据。

它最常见的使用场景就是:统计分数、保存编号、批量处理结果、做遍历和排序。

学数组时,重点不是只记住 int[] 怎么写,而是理解:

  1. 数组保存的是什么。
  2. 数组长度为什么固定。
  3. 下标为什么从 0 开始。
  4. 遍历时为什么最容易写错边界。

核心原理拆解#

1. 数组保存同类型元素#

数组中的每个元素类型必须一致。

int[] numbers = {10, 20, 30};
String[] names = {"Tom", "Jerry"};

如果需要保存不同类型的数据,通常要改用对象、集合或其他结构,而不是强行塞进数组。

2. 数组长度固定#

数组创建完成后,长度就不能再变了。

int[] scores = new int[3];

这里 scores 的长度永远是 3,不能中途扩容成 45。如果你需要动态增长,通常应该用 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]); // 10
System.out.println(numbers[2]); // 30

长度为 3 的数组,合法下标是 012
访问 numbers[3] 会直接越界。

img
img

5. 数组本身也是对象引用#

数组变量里存的不是所有元素本身,而是数组对象的引用。

int[] arr = new int[3];
int[] other = arr;
other[0] = 99;
System.out.println(arr[0]); // 99

这说明 arrother 指向的是同一个数组对象。

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. 数组默认值是什么#

基本类型数组是对应类型的零值,比如 int0booleanfalse;引用类型数组默认值是 null

4. 数组和普通变量有什么不同#

数组变量保存的是数组对象的引用,不是所有元素本身。

一句话总结#

数组是固定长度的同类型数据容器,最重要的是记住下标从 0 开始、长度不可变、越界会报错。

文章目录

文章目录