Java数组是引用类型,声明需明确元素类型和维数,推荐写法为int[] array;初始化分静态(如int[] arr = {1,2,3})和动态(如int[] arr = new int[5])两种;访问越界抛ArrayIndexOutOfBoundsException。

Java中数组的声明与初始化必须区分类型和维度
Java数组不是基本类型,而是引用类型,声明时必须明确元素类型和维数。常见错误是把声明写成 int array[] = new int[5]; 就以为可以省略类型——其实这只是语法糖,int[] array 才是推荐写法,语义更清晰,也避免在声明多个变量时出错(比如 int[] a, b; 中 b 是数组,而 int a[], b; 中 b 是 int)。
初始化分静态和动态两种:
-
int[] arr1 = {1, 2, 3};—— 静态初始化,编译期确定长度,不能在非声明语句中使用 -
int[] arr2 = new int[5];—— 动态初始化,运行时分配堆内存,所有元素自动初始化为默认值(0、false、null) - 混合写法
int[] arr3 = new int[]{1, 2, 3};合法但冗余,仅在匿名数组场景有用(如方法调用:foo(new String[]{"a", "b"});)
访问数组元素时越界会抛出 ArrayIndexOutOfBoundsException
Java数组下标从 0 开始,最大合法索引是 length - 1。这个异常是 RuntimeException,编译器不强制捕获,但运行时一旦触发程序立即中断。常见踩坑点:
- 循环条件写成
i 而非i - 对空数组(
arr.length == 0)直接访问arr[0] - 用负数索引(如
arr[-1]),同样触发该异常
安全做法是始终校验索引范围,尤其在接收外部输入或计算索引时:
立即学习“Java免费学习笔记(深入)”;
if (index >= 0 && index < arr.length) {
return arr[index];
} else {
throw new IllegalArgumentException("Index " + index + " out of bounds for length " + arr.length);
}数组长度固定且不可变,需要扩容请改用 ArrayList
Java数组创建后 length 字段就不可修改,试图“添加”元素只会导致编译失败或运行时异常。例如:
-
arr.length = 10;→ 编译错误:length是final字段,只读 -
arr[5] = 99;(当arr.length == 3)→ 运行时抛出ArrayIndexOutOfBoundsException
如果业务逻辑需要动态增删元素,应直接使用 ArrayList:new ArrayList。它底层仍用数组实现,但封装了自动扩容(默认1.5倍)、元素移动等细节。注意:原始类型数组(如 int[])无法直接转为 ArrayList,需手动装箱或用 Arrays.stream(arr).boxed().collect(Collectors.toList())。
多维数组本质是“数组的数组”,每行长度可不一致
Java没有真正意义上的多维数组,int[][] matrix 实际是 int[] 类型的一维数组,每个元素又是一个 int[]。这意味着:
- 可以创建“不规则”数组:
int[][] jagged = {{1}, {2, 3}, {4, 5, 6}}; -
jagged.length是行数,jagged[0].length是第0行的列数,各行长度可不同 - 不能用
new int[3][4]初始化后,再给某一行赋一个长度不同的新数组(如jagged[0] = new int[5];是允许的,但容易引发后续逻辑混乱)
遍历二维数组时,别假设所有行等长:
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[i].length; j++) { // 必须用 matrix[i].length
System.out.print(matrix[i][j] + " ");
}
System.out.println();
}数组的 length 字段、越界检查机制、以及“数组即对象”的设计,决定了它轻量但僵硬。实际开发中,多数需要动态操作的场景,应该跳过手动管理数组,直接选用集合类。










