java中可通过list嵌套模拟不规则数组,推荐用arraylist实现自然扩容;若用object[][]需手动分步扩容行数与单行,并注意null检查和预估容量。

Java中没有原生的“不规则数组”类型,但可以通过二维数组(Object[][] 或 T[][])或嵌套集合(如 List<list>></list>)模拟不规则结构——即每行长度不同。动态扩容的核心不是“扩容数组本身”,而是**在运行时灵活调整每行的容量,并管理整体结构**。关键在于选择合适的数据结构、明确扩容时机与策略。
用 List> 替代二维数组实现自然扩容
这是最推荐的方式。ArrayList 内部已封装扩容逻辑,无需手动处理底层数组复制。
- 外层
List控制“行数”,可随时 add/remove 行 - 每行是独立的
List<t></t>,各自按需 grow/shrink - 添加新元素时,先确保目标行存在(必要时创建空行),再调用
get(row).add(element) - 示例:初始化三行,第二行追加两个元素
- > jagged = new ArrayList();
jagged.add(new ArrayList(Arrays.asList("a", "b"))); // row0
jagged.add(new ArrayList()); // row1(空)
jagged.add(new ArrayList(Arrays.asList("x"))); // row2
jagged.get(1).addAll(Arrays.asList("hello", "world")); // 自动扩容row1
手动管理 Object[][] 时的扩容要点
若必须用原始二维数组(如性能敏感场景),扩容需分两步:扩展行数 + 单独扩容某行。
- 扩展行数:用
Arrays.copyOf()复制外层数组,新长度大于当前行数 - 扩容某行:获取该行引用,用
Arrays.copyOf()复制并赋值回原位置 - 注意:不能直接对
arr[i] = Arrays.copyOf(arr[i], newSize)后忽略 null 行——需先检查arr[i] != null - 避免频繁扩容:可预估最大行/列数,或采用倍增策略(如每次扩容为原长 1.5 倍)
封装成工具类提升复用性
把扩容逻辑封装为通用方法,降低出错概率。
- 提供
ensureRowCapacity(int row, int minCapacity):确保第 row 行至少有 minCapacity 个位置 - 提供
addRow(List<t> newRow)</t>或insertRow(int index, List<t> newRow)</t> - 内部统一处理 null 行初始化、数组复制、边界检查
- 可加入泛型约束(如
<t extends serializable></t>)适配序列化等需求
避开常见陷阱
不规则结构容易引发 NPE 或越界,扩容时尤其要注意:
- 访问
list.get(row)前,确认row ;否则应先 <code>add(new ArrayList())补齐 - 不要误用
array.length当作某行长度——array[row].length才是该行动态长度 - 多线程环境下,
ArrayList非线程安全,可改用CopyOnWriteArrayList或加锁 - 大量稀疏数据时,考虑用 Map
> 替代 List,节省内存
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











