java二维数组本质是一维数组的数组,声明时必须指定第一维长度,第二维可延迟分配;访问前需双重校验:先判非空再判列索引不越界。

Java 二维数组不是真正的“二维”,而是“一维数组的数组”——这个本质直接决定了它的声明方式、内存布局和边界安全逻辑。理解这一点,才能避开空指针、越界、缓存不友好等常见陷阱。
声明必须明确第一维,第二维可延迟分配
Java 要求声明时至少指定行数(第一维长度),列数(第二维)可以留空,形成“不规则数组”结构:
- 合法且常用:int[][] arr = new int[3][]; —— 创建含 3 个 null 引用的一维数组,每行需单独 new;
- 矩形数组:int[][] matrix = new int[4][5]; —— 系统自动为每行分配 5 个 int,所有元素初始化为 0;
- 错误写法:int[][] bad = new int[][5]; —— 编译失败,第一维长度不可省略。
访问前必须双重校验:非空 + 长度足够
由于第二维是独立对象,未初始化时值为 null,直接访问 arr[i][j] 会触发 NullPointerException;即使已初始化,列索引也可能越界。安全访问需两步检查:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 先判 arr[i] != null;
- 再判 j
- 例如:if (arr != null && i 才能安全读取 arr[i][j]。
内存局部性影响性能,但不保证跨行连续
基本类型二维数组(如 int[][])中,每行内部元素在堆内存中连续存储,利于 CPU 缓存预取;但不同行之间地址不连续,甚至可能分散在不同内存页。这意味着:
- 按行遍历(i 外层、j 内层)比按列遍历更高效;
- 避免在循环内反复创建新行(如在 for 中 new int[100]),会加剧 GC 压力;
- 若频繁随机访问列方向数据,考虑转为一维数组加坐标映射(row * cols + col),或改用 List
- >(牺牲部分性能换灵活性)。
静态初始化天然规避 null 行,但需注意不规则性
使用大括号直接赋值(如 int[][] a = {{1,2}, {3}})时,编译器自动生成完整结构,每行都非 null,且长度由字面量决定:
- a.length == 2,a[0].length == 2,a[1].length == 1;
- 遍历时必须用 arr[i].length 动态获取每行长度,不能假设统一列数;
- 这种写法适合配置表、小规模查表等场景,不适合动态增删。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










