java二维数组本质是“一维数组的数组”,天然支持不规则行列长度;声明时用int[][] arr = new int[3][]留空内层,再逐行分配;编译期已知数据优先用字面量{ {1,2}, {3,4,5}, {6} };遍历时须用arr[i].length动态取列数并判空;复杂场景推荐list。

Java里没有“规则二维数组”这个强制约束,所谓行列长度不一致,其实是它的默认行为——二维数组本质是“一维数组的数组”,每行可以独立指定长度。关键不在避免不一致,而在如何安全、清晰地使用它。
声明时就接受不规则性
别用 new int[3][4] 这种固定列数写法,那是矩形数组。要支持不规则,第一步就是声明外层但留空内层:
-
int[][] arr = new int[3][];—— 创建长度为3的引用数组,每个元素初始为null - 再逐行分配:
arr[0] = new int[2]; arr[1] = new int[5]; arr[2] = new int[1]; - 这样三行长度分别为2、5、1,天然不规则,且内存只按需分配
初始化优先用字面量语法
如果数据在编译期已知,直接用大括号嵌套最安全简洁:
int[][] jagged = { {1, 2}, {3, 4, 5}, {6} };- 编译器自动推断外层数组长度为3,每行长度由内部花括号内容决定
- 这种写法不会出现
null行,访问jagged[i][j]前无需判空
遍历时必须主动检查边界
不能假设所有行都有相同列数。传统双层for循环容易越界:
- 错误示范:
for (int j = 0; j —— 强制以第0行长度为标准,其他行可能越界 - 正确做法:外层遍历行,内层用
arr[i].length动态取当前行列数 for (int i = 0; i
复杂场景改用泛型集合
当维度嵌套加深(比如三维以上)、长度频繁变动,或需增删元素时,原始数组会很吃力:
List<list>> grid = new ArrayList();</list>- 每行可独立 add/remove 元素,
grid.get(i).size()总是有效,不需判空 - 代价是装箱开销和稍慢的随机访问,但结构灵活性高得多
- 注意:不能写
List<int></int>,基本类型只能用包装类或维持int[]作为元素
不复杂但容易忽略——真正耗时的不是定义,而是后续每次访问、遍历、序列化时都得自己把边界逻辑补全。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











