java不规则数组本质是“数组的数组”,外层数组连续存储引用,内层数组独立分配、彼此不连续;规则数组则一次性分配固定大小的多块内存,行为更接近传统矩阵。

规则数组和不规则数组在内存中根本不是同一种结构——前者是“一块整砖”,后者是“几块散砖用绳子串起来”。
规则二维数组:外层+内层都固定,内存接近连续
写 int[][] matrix = new int[3][4] 时,JVM 一次性分配:一个长度为 3 的 int[] 引用数组 + 三个长度均为 4 的 int 数据数组。虽然三块数据数组物理上未必紧挨着,但每行长度一致、分配时机统一,整体行为接近传统“矩形矩阵”。
访问 matrix[1][2] 不会出错,因为所有内层数组已自动初始化。
不规则二维数组:外层只管“指针槽”,内层各自独立
写 int[][] jagged = new int[3][] 只做了最轻量的事:在堆上建一个含 3 个 null 的引用数组。此时:
• 每个 jagged[i] 都是空的,还没指向任何 int[]
• 后续必须显式执行 jagged[0] = new int[2]、jagged[1] = new int[5] 等操作
• 每个子数组在堆中任意位置分配,彼此地址不相关,长度互不影响
• 若忘了给某行赋值(如 jagged[2] 仍为 null),访问时直接抛 NullPointerException
关键差异就三点
- 空间分配时机不同:规则数组一步到位;不规则数组分两步——先搭架子,再填内容
- 内存连续性不同:规则数组各子数组长度相同,便于预测布局;不规则数组各子数组地址完全离散,无法按统一偏移计算元素位置
-
安全性边界不同:规则数组访问任意
[i][j](在维度范围内)都安全;不规则数组必须先确认jagged[i] != null,再检查j
这种“数组的数组”模型不是 Java 的妥协,而是刻意设计的灵活性来源——它让内存使用更贴合真实数据分布,比如存储不同长度的日志记录、稀疏表格或树形路径。











