java不规则二维数组本身不能动态变长,但可用list替代实现灵活存储:外层list控制行数,每行用arraylist自动扩容;若必须用object[][],需手动分步扩容并严格空值检查。

Java 不规则二维数组本身不能“动态变长”,但可以通过模拟结构实现灵活的数据记录存储——核心不是让数组自己伸缩,而是用可扩展的容器替代原始数组,或在数组框架内手动管理每行容量。
用 List> 替代二维数组,天然支持变长
这是最实用、最安全的选择。外层 List 控制行数,每行是独立的 ArrayList,添加元素时自动扩容,无需关心底层复制逻辑:
- 初始化:先创建外层空列表,再逐行添加子列表(可为空)
- 追加记录:调用 jagged.get(row).add(value) 即可,若该行尚未创建,需先 jagged.add(new ArrayList())
- 插入整行:用 jagged.add(index, newRowList) 或 jagged.set(row, newList)
- 删除某行:直接 jagged.remove(row),不影响其他行
若必须用 Object[][],扩容需分两步操作
原始数组无法自动增长,每次扩容都要显式复制。关键点在于分离“行扩容”和“列扩容”:
- 增加行数:用 Arrays.copyOf(arr, newArrLength) 扩展外层数组长度,新位置默认为 null
- 扩展某行长度:先确认 arr[i] != null,再执行 arr[i] = Arrays.copyOf(arr[i], newColLength)
- 新增一行:直接赋值 arr[newRowIdx] = new Object[initialSize],避免 NPE
- 建议预估容量,避免频繁复制;也可封装成 ensureRowCapacity(int row, int minSize) 方法统一处理
遍历时务必做空值与边界检查
不规则结构下,arr[i] 可能为 null,arr[i].length 不能跨行复用。传统 for 循环最可控:
- 外层循环条件: i
- 进入内层前加判断:if (arr[i] != null)
- 内层循环条件:j ,而非固定值
- 读写单个元素前,确保 i 和 j 都在各自有效范围内
典型应用场景与数据建模建议
不规则结构适合记录长度不一的业务数据,例如:
- 学生成绩表:每班人数不同 → 每行存一个班级的成绩数组
- 日志批次:每天日志条数浮动 → 每行代表一天,元素为当日日志对象
- 稀疏配置项:不同模块配置字段数不同 → 每行一个模块,列为其键值对
- 优先选用 List
- >,尤其当增删频繁;仅在性能敏感、数据稳定、已知最大规模时才考虑 Object[][] + 手动扩容
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











