当前位置: 首页 > news >正文

java中二维数组笔记

课程链接:黑马程序员java零基础[上]

1.二维数组的内存分布

二维数组内存图
在 Java 中,二维数组并不是一整块连续的二维空间,而是数组的数组。具体而言,在声明一个二维数组:如int[][] arr = new int[2][3];时,内存中会发生如下:

1.1 栈上的引用变量

首先,在栈内存中,JVM(java虚拟机) 会创建一个名为 arr 的引用变量。它不存实际数据,只是指向堆上的数组对象。

1.2 堆上的顶层数组

在 Java 中,所有通过 new 创建的对象,包括数组,都是在堆内存中分配的。对于二维数组,JVM 会先在堆上创建一个长度为 2 的一维数组:

  • 这个数组的特殊之处在于,它的元素类型是 int[],也就是“一维整型数组的引用”。
  • 上的 arr 就指向这个一维数组的首地址

1.3 行数组与元素

接下来,JVM 会为每一行分别创建一个长度为 3 的 一维数组对象:

  • arr[0] 指向第一行数组,内部存放 arr[0][0]、arr[0][1]、arr[0][2]的值(默认初始化为 0)。

  • arr[1] 指向第二行数组,内部存放第二行的数据,依此类推。
    注意:

  • 每一行数组内部的元素是连续存放的。

  • 不同的行可能不连续

1.4 访问数组元素

访问数组时遵循“先行后列”的逻辑:

  1. arr[i] → 找到第 i 行数组的引用

  2. arr[i][j] → 在该行数组里找到第 j 个元素。

所以,二维数组本质上是数组的数组:外层数组管理“行”,内层数组存数据。

2.二维数组的特殊写法

二维数组除了标准写法和简化写法外还存在更灵活的用法。

2.1交错数组:

标准的二维数组每一行的列数都是相同的,但在实际应用中,每一行的元素个数可以不同。

实现方式:
在初始化二维数组时,只指定其“行数”(即顶层数组的长度),而暂时不指定“列数”。

// 1. 只定义行数,此时 arr[0], arr[1] 都还是 null
int[][] arr = new int[2][];	// 需要定义数组后再手动创建该二位数组下的2个一维数组
int[] arr0 = {11, 22};
int[] arr1 = {11, 22, 33};
// 2. 手动为每一行分别创建不同长度的一维数组
arr[0] = arr0;
arr[1] = arr1;

此时堆内存和栈内存中的分布为:
在这里插入图片描述
优点:
这种写法的最大优点是高度的灵活性。它允许我们根据实际需求精确控制每一行数组的长度,从而有效节约内存空间,避免为不存在的元素分配内存。

2.2行引用的重新赋值:

既然二维数组的每一行本身就是一个独立的数组引用,那么我们就可以将这个引用指向任何其他兼容的一维数组对象。

实现方式:
先创建一个标准的二维数组,然后再用其他已经存在的一维数组引用来“覆盖”或“替换”它的某几行。

int[][] arr = new int[2][3];
int[] arr1 = {11, 22};
int[] arr2 = {33, 44, 55};arr[0] = arr1;
arr[1] = arr[2];

此时堆内存和栈内存中的分布为:
在这里插入图片描述

优点:
这种写法展示了 Java 引用的强大之处。它不是用新数组的“值”去覆盖原数组,而是直接替换“行”的引用,将二维数组的某一行与一个独立的一维数组关联起来。原本不再被引用的行数组会由 GC 自动回收,无需手动管理内存。

http://www.xdnf.cn/news/1442035.html

相关文章:

  • Git或TortoiseGit的小BUG(可解决):空库报错Could not get hash of ““
  • Nginx中的内置变量、指令、URL重写功能及其虚拟主机配置、负载均衡配置
  • 关于linux编程——网络编程2
  • 工业4.0时代的通信革命:OPC UA Pub/Sub机制全面解析
  • 百万级并发下的微服务架构设计之道:从阿里双11看分布式系统核心原则与落地实践
  • 云计算培训为什么这么贵?
  • EagleTrader观察|你的固定心态,可能正在悄悄让你交易破产
  • Element UI MessageBox 渲染虚拟节点的坑与解决方案
  • 【深度学习新浪潮】用3DGS做三维重建有哪些主要的技术路线可供选择?
  • 【随手记】vscode中C语言满足KR风格的方法
  • Leetcode—695. 岛屿的最大面积【中等】
  • Docker实战指南:从安装到架构解析
  • 【Linux】网络(中)
  • 数据结构:栈和队列(上)
  • 数据结构从青铜到王者第十九话---Map和Set(2)
  • 下载必要软件
  • Qt读写Excel--QXlsx基本使用
  • 基于-轻量级文档搜索系统的测试报告
  • 【GM3568JHF】FPGA+ARM异构开发板 使用指南:WIFI
  • SQLite3 操作指南:SQL 语句与 ORM 方法对比解析​
  • 存算一体:重构AI计算的革命性技术(1)
  • K8s Pod CrashLoopBackOff:从镜像构建到探针配置的排查过程
  • react-android-0.80.2-debug.aar下载很慢
  • GitHub 宕机自救指南技术文章大纲
  • Flutter Android真机器调式,虚拟机调试以及在Vscode中开发Flutter应用
  • 充电座结构设计点-经验总结
  • 10.2 工程学中的矩阵(2)
  • Android/Java 异常捕获
  • 电子病历空缺句的语言学特征描述与自动分类探析(以GPT-5为例)(中)
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘isort’问题