Java中二维数组实为“数组的数组”,支持不规则结构;声明如int[][] arr = new int3或int[][] arr = {{1,2},{3,4,5},{6}};遍历时需判空防NullPointerException。
Java里没有真正的“二维数组”,只有“数组的数组”。这意味着第二维长度可以不一致,也决定了初始化必须分步或用花括号语法显式指定结构。
int[][] arr = new int[3][4]; 创建 3 行 × 4 列的矩形结构,所有元素默认为 0
int[][] arr = new int[3][]; 只分配第一维(3 个引用),每行需单独初始化,如 arr[0] = new int[2];
int[][] arr = {{1, 2}, {3, 4, 5}, {6}}; 使用静态初始化,各行长度可不同(不规则数组)如果只初始化了部分行(比如 new int[3][] 后只赋值了 arr[0] 和 arr[2]),直接用增强 for 或下标访问 arr[1].length 会触发 NullPointerException。
for (int i = 0; i < arr.length; i++) {
if (arr[i] != null) {
for (int j = 0; j < arr[i].length; j++) {
System.out.print(arr[i][j] + " ");
}
}
}for (int[] row : arr) 可以,但内部再用 for (int x : row) 前仍要检查 row 是否为 null
Java中数组是引用类型,但传递的是引用的副本。修改数组内容(如 arr[i][j] = 99)会影响原数组;但重新赋值整个行(如 arr[i] = new int[]{...})不会改变调用方的该行引用。
AtomicReference)int[][] data 即可,不需要 int[] data[] —— 后者虽能编译,但属于过时的 C 风格写法,可读性差List 是更灵活的替代方案用 Object[][] 存 Integer、Double 等包装类,会带来三重开销:装箱/拆箱、对象头内存、GC 压力。而 int[][] 在堆上是连续的原始数据块(每行内连续),访问更快。
int[][] + 特殊哨兵值(如 -1),或用 Optional[][] (但代价更高)int[][] 的内存占用 ≈ 行数 × (12 + 列数 × 4) 字节(12 是对象头,JVM 实现相关)
池,避免 GC 频繁触发