最安全声明是int[][],初始化分两步:先new int[3][]再逐个new内层数组;遍历时传统for嵌套更稳,可防空指针和越界。

Java二维数组怎么声明和初始化才不会报错
直接用 int[][] 声明最安全,别写成 int[] [](空格干扰编译器判断),也别漏掉第二个方括号。初始化时分两步:先分配外层数组,再逐个分配内层数组——这是理解“不规则二维数组”的关键。
-
int[][] arr = new int[3][4];:创建 3×4 的矩形数组,所有元素默认为 0 -
int[][] arr = new int[3][];:只分配 3 个null引用,后续必须手动给arr[0]、arr[1]等赋值新数组 - 错误写法:
int[][] arr = new int[][4];→ 编译报错illegal start of expression
遍历二维数组时 for-each 和传统 for 哪个更稳
用传统 for 套嵌套更可控,尤其当数组可能不规则(比如 arr[0].length != arr[1].length)时,for-each 容易触发 NullPointerException 或越界。
- 安全写法:
for (int i = 0; i - 危险写法:
for (int[] row : arr) { for (int v : row) { ... } }—— 如果某行是null,第二层循环直接崩 - 性能差异不大,但传统 for 能随时
break外层,for-each没法直接跳出两层
把二维数组传给方法时要注意什么
Java 传的是引用拷贝,方法里重新赋值 arr = new int[5][5] 不影响原数组;但修改 arr[i][j] 或 arr[i] = new int[...] 会生效——这点常被误判为“传值”。
- 想防止方法意外改内容?要么传副本(
Arrays.deepCopy()),要么在方法开头加if (arr == null)防空指针 - 参数类型必须严格匹配:
void foo(int[][] a)不能接收Integer[][],自动装箱不适用于数组维度 - 泛型无法直接约束二维数组,
List<list>></list>更灵活但有装箱开销和内存放大
二维数组和 ArrayList> 实际选哪个
固定尺寸、数值密集、追求缓存友好就用 int[][];需要频繁增删行/列、类型不确定、逻辑上更像“表格集合”,就选嵌套 ArrayList。
立即学习“Java免费学习笔记(深入)”;
-
int[][]内存连续,CPU 缓存命中率高,适合科学计算或图像像素操作 -
ArrayList<arraylist>></arraylist>每行可变长,支持add()/remove(),但每层都有对象头开销,且Integer装箱带来 GC 压力 - 混用风险:别把
int[][]强转成Object[][]再转回来——运行时报ClassCastException
二维数组的“二维感”其实是假象,它本质是一维引用数组,每个元素指向另一个一维数组。真正容易出问题的,永远是那个没检查 arr[i] 是否为 null 的瞬间。










