java中二维数组本质是“数组的数组”,即一维引用数组,其元素指向独立的一维int数组;内存中各子数组彼此不连续,长度可不同,访问时需经两次引用查找并分别校验索引。

Java里没有真正意义上的“多维数组”,只有数组的数组。理解它的存储结构,关键在于抓住“引用”这个核心——二维数组变量本身是一个引用,它指向的是一维数组的引用集合。
二维数组本质是一维数组,元素是引用
声明 int[][] arr = new int[3][4]; 看似创建了一个3×4的表格,实际在内存中:
-
arr是一个一维数组,长度为3,类型是int[](即“指向int数组的引用”); -
arr[0]、arr[1]、arr[2]各自是一个引用,分别指向三个独立的一维数组; - 每个一维数组(如
arr[0])才真正存着4个int值,连续分布在内存中。
不规则二维数组更体现引用特性
像 int[][] jagged = new int[3][]; 这种写法,更能看清引用关系:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 此时
jagged是长度为3的一维引用数组,但所有元素初始值都是null; - 必须显式赋值:
jagged[0] = new int[2];表示让第0个引用指向一个含2个int的新数组; -
jagged[1] = new int[5];则让它指向另一个长度为5的数组——两块内存完全独立,长度可不同。
访问和越界都依赖引用链
写 arr[i][j] 实际做了两步操作:
- 先用
i查找arr[i]—— 若i超出arr.length,抛ArrayIndexOutOfBoundsException; - 再用
j查找arr[i][j]—— 若arr[i]是null或j超出arr[i].length,同样抛异常; - 所以
arr[0].length获取的是第0行的列数,而arr.length获取的是总行数。
内存布局示意(以 int[][] a = {{1,2}, {3}} 为例)
变量 a 存在栈中,指向堆中一块内存,该内存是长度为2的引用数组;
-
a[0]指向另一块堆内存(含两个int:1 和 2); -
a[1]指向第三块堆内存(含一个int:3); - 这三块堆内存彼此不连续,也不关联——它们只靠引用串联。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










