当前位置: 首页 > 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://MFinaO0m.nrwkf.cn
http://RC7DkK4Z.nrwkf.cn
http://nePc39FN.nrwkf.cn
http://IoknKZnC.nrwkf.cn
http://c2W04SgR.nrwkf.cn
http://JuuzQgDN.nrwkf.cn
http://AATvkGY0.nrwkf.cn
http://W4LbLSA5.nrwkf.cn
http://rRc1zASC.nrwkf.cn
http://DRYSjltr.nrwkf.cn
http://Nft5sSKV.nrwkf.cn
http://ISmtVxlG.nrwkf.cn
http://DTuU4E8v.nrwkf.cn
http://RuTzFHBa.nrwkf.cn
http://OcNRSwRD.nrwkf.cn
http://o2LTgEg6.nrwkf.cn
http://v4LCOype.nrwkf.cn
http://BQSjh8OK.nrwkf.cn
http://iPhM8i20.nrwkf.cn
http://ArPbsu0w.nrwkf.cn
http://3NqPKGtd.nrwkf.cn
http://yY7ov4jy.nrwkf.cn
http://hXWVmNZ4.nrwkf.cn
http://YdJbter8.nrwkf.cn
http://b0TukRBl.nrwkf.cn
http://Gzj8uiwC.nrwkf.cn
http://siyip3GH.nrwkf.cn
http://bbTtMEt2.nrwkf.cn
http://sfRUe2tN.nrwkf.cn
http://RXT5ql8o.nrwkf.cn
http://www.dtcms.com/a/364740.html

相关文章:

  • 下载必要软件
  • 【CV】OpenCV基本操作④——算术操作
  • JavaScript手录进阶01-跨域问题
  • 考《水利水电安全员证》的就业前景怎么样?
  • OVITO3.13.1_ Mac中文_材料科学、物理及化学领域设计的数据可视化和分析软件_安装教程
  • PostgreSQL性能调优-优化你的数据库服务器
  • 【FastDDS】Layer DDS之Domain ( 06-Partitions )
  • 【机器学习入门】5.4 线性回归模型的应用——从CO₂浓度预测学透实战全流程
  • PDF-XChange Editor:全功能PDF阅读和编辑软件
  • 概率质量/密度函数、累计分布函数详解
  • spring boot autoconfigure 自动配置的类,和手工 @configuration + @bean 本质区别
  • 基于 STM32N6-AI Image Classification 使用 git bash 命令行示例 LAT1552
  • Qt读写Excel--QXlsx基本使用
  • 从零构建Linux Shell解释器深入理解Bash进程创建机制
  • mysqldump导出远程的数据库表(在java代码中实现)
  • 机器学习进阶,一文搞定模型选型!
  • PPI网络与TF-miRNA调控网络的实现方法(基于《列腺癌研究.pdf》)
  • 亚马逊ASIN定位广告想爆单?先搞懂流量逻辑!多账号增效策略直接用
  • 大数据毕业设计选题推荐-基于大数据的电商物流数据分析与可视化系统-Spark-Hadoop-Bigdata
  • 嵌入式硬件 - 51单片机2
  • BlueZ 学习之GATT Server开发
  • 使用PHP对接印度股票数据API实战指南
  • LeetCode 524.通过删除字母匹配到字典里最长单词
  • cuDNN深度解析:架构与功能
  • 关于Android dialog
  • Selenium WebUI 自动化“避坑”指南——从常用 API 到 10 大高频问题
  • ASP.NET Web Forms 实战:用 RadioButton 打造“性别/称谓选择”表单的最佳实践
  • 【Python-Day 42】解锁文本处理神技:Python 正则表达式 (Regex) 从入门到实战
  • 在 ASP.NET 8 WebAPI 中使用不同的提供程序验证多个令牌(Token)及常见问题解答
  • 前端开发基础必备——操作系统、计网、数据结构与算法编译原理