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.pswp.cn/news/921117.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/921117.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

系统架构设计师备考第13天——计算机语言-多媒体

一、多媒体基础概念媒体的分类 感觉媒体:人类感官直接接收的信息形式(如声音、图像)。表示媒体:信息的数字化表示(如JPEG图像、MP3音频)。显示媒体:输入/输出设备(如键盘、显示器&am…

指针高级(1)

1.指针的运算2.指针运算有意义的操作和无意义的操作、#include <stdio.h> int main() {//前提条件&#xff1a;保证内存空间是连续的//数组int arr[] { 1,2,3,4,5,6,7,8,9,10 };//获取0索引的内存地址int* p1 &arr[0];//通过内存地址&#xff08;指针P&#xff09;…

【可信数据空间-Trusted Data Space综合设计方案】

可信数据空间-Trusted Data Space综合设计方案 一.简介与核心概念 1.什么是可信数据空间 2.核心特征 3.主要应用场景 二、 产品设计 1. 产品定位 2. 目标用户 3. 核心功能模块 a. 身份与访问管理 b. 数据目录与服务发现 c. 策略执行与合约管理 d. 数据连接与计算 e. 审计与溯源…

技术方案之Mysql部署架构

一、序言在后端系统中&#xff0c;MySQL 作为最常用的关系型数据库&#xff0c;其部署架构直接决定了业务的稳定性、可用性和扩展性。你是否遇到过这些问题&#xff1a;单机 MySQL 突然宕机导致业务中断几小时&#xff1f;高峰期数据库压力过大&#xff0c;查询延迟飙升影响用户…

js语言编写科技风格博客网站-详细源码

<!-- 科技风格博客网站完整源码 --> <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <ti…

AI如何理解PDF中的表格和图片?

AI的重要性已渗透到社会、经济、科技、生活等几乎所有领域&#xff0c;其核心价值在于突破人类能力的物理与认知边界&#xff0c;通过数据驱动的自动化、智能化与优化&#xff0c;解决复杂问题、提升效率并创造全新可能性。从宏观的产业变革到微观的个人生活&#xff0c;AI 正在…

Graphpad Prism 实战教程(一):小鼠体重变化曲线绘制全流程(含数据处理与图表美化)

在药理实验、动物模型构建等科研场景中,小鼠体重变化数据是评估实验干预效果(如药物安全性、疾病进展影响)的核心指标之一。将零散的体重数据转化为直观的折线图,不仅能清晰呈现体重随时间的波动趋势,更是后续结果解读与论文图表呈现的关键步骤。本文将从 Excel 数据整理开…

计算机视觉(六):腐蚀操作

腐蚀&#xff08;Erosion&#xff09;是计算机视觉和图像处理中一种基础且至关重要的形态学操作。它与膨胀&#xff08;Dilation&#xff09;互为对偶&#xff0c;共同构成了形态学处理的基石。腐蚀操作主要用于缩小前景物体的面积&#xff0c;去除图像中的噪声&#xff0c;以及…

AI随笔番外 · 猫猫狐狐的尾巴式技术分享

&#x1f380;【开场 咱才不是偷懒写博客】&#x1f43e;猫猫趴在键盘边&#xff0c;耳朵一抖一抖&#xff1a;“呜呜呜……明明说好要写技术总结&#xff0c;结果咱脑袋里全是尾巴……要不今天就水一篇随意的 AI 技术分享算啦&#xff1f;”&#x1f98a;狐狐把书卷轻轻放在桌…

数据分析与挖掘工程师学习规划

一、数学与统计学基础概率论与数理统计随机变量、概率分布&#xff08;正态分布、泊松分布等&#xff09;、大数定律、中心极限定理假设检验、置信区间、方差分析&#xff08;ANOVA&#xff09;、回归分析贝叶斯定理及其在分类问题中的应用&#xff08;如朴素贝叶斯算法&#x…

(线上问题排查)4.CPU使用率飙升:从应急灭火到根因治理

目录 从宏观到微观&#xff1a;CPU排查的“破案”流程 第一阶段&#xff1a;应急响应——找到“谁”在捣乱 1. 全局视角&#xff1a;top命令的初窥 2. 进程内窥视&#xff1a;揪出问题线程 第二阶段&#xff1a;深入分析——理解“为什么” 3. 线程堆栈分析&#xff1a;查…

如何快速实现实时云渲染云推流平台的网络环境配置与端口映射

LarkXR是由Paraverse平行云自主研发的实时云渲染推流平台&#xff0c;以其卓越的性能和丰富完备的功能插件&#xff0c;引领3D/XR云化行业风向标。LarkXR适用于3D/XR开发者、设计师、终端用户等创新用户&#xff0c;可以在零硬件负担下&#xff0c;轻松实现超高清低时延的3D交互…

13、Docker构建镜像之Dockerfile

13、Docker构建镜像之Dockerfile 1、Dockerfile是什么 Dockerfile是Docker镜像的构建文件&#xff0c;它包含了一系列指令和参数&#xff0c;用于定义如何构建一个Docker镜像。通过Dockerfile&#xff0c;我们可以将应用程序和其依赖的组件打包到一个独立的镜像中&#xff0c;方…

TensorFlow 深度学习 | 三种创建模型的 API

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 TensorFlow 深度学习 | 三种创建模型的 API 在 TensorFlow 中,模型的构建方式非常灵…

LeetCode82删除排序链表中的重复元素 II

文章目录删除排序链表中的重复元素 II题目描述示例核心思想最优雅解法算法步骤详解示例1演示&#xff1a;[1,2,3,3,4,4,5]关键理解点1. 虚拟头节点的作用2. 重复检测逻辑3. 完全删除重复节点边界情况处理情况1&#xff1a;空链表情况2&#xff1a;单节点情况3&#xff1a;全部重…

蓝桥杯算法之基础知识(6)

目录 Ⅰ.os操作 Ⅱ.时间库&#xff08;很重要&#xff09; Ⅲ.基本单位换算&#xff08;ms&#xff0c;min&#xff0c;h的单位换算&#xff09; Ⅳ.时间戳 Ⅴ.文件读取 Ⅵ.堆 Ⅶ.math操作 Ⅷ.range&#xff08;&#xff09;方法单独使用 Ⅸ.python 的异常输出 Ⅹ.for…

多架构/系统图,搞懂:期货账户体系,太通透了!

Hi,围炉喝茶聊产品的新老朋友好!上周和大家聊了国内6大期货交易所清算交收,感兴趣的话烦请戳蓝色链接去学习,就当为下面学习作知识铺垫,更重要是温故知新,并保持知识连贯性。另外围炉特意整理了与账户相关的文章,如下所示: “保证金被扣”拆解期货交易所:清算交收体系…

python-对图片中的头像进行抠图

要实现对图片中人脸或头像进行抠图&#xff0c;可以使用 Python 的 人脸检测 和 掩码生成裁剪工具。这里提供几种实现方法&#xff0c;用于检测图片中的人脸区域并实现裁剪效果&#xff1a; 方案 1: 使用 OpenCV 和 Haar级联检测人脸并裁剪 步骤 1: 安装依赖 安装 OpenCV 和其他…

OpenLayers常用控件 -- 章节一:地图缩放控件详解教程

前言在Web地图开发中&#xff0c;缩放控件是用户与地图交互最基本也是最重要的功能之一。OpenLayers作为功能强大的开源地图库&#xff0c;提供了多种缩放控件来满足不同的交互需求。本文将结合一个完整的Vue.js示例&#xff0c;详细介绍OpenLayers中三种主要的缩放控件&#x…

拓扑学:数学领域的魅力之钥

拓扑学:数学领域的魅力之钥 关键词:拓扑学、连续变形、同胚、流形、代数拓扑、点集拓扑、应用数学 摘要:本文深入探讨拓扑学这一现代数学的重要分支,从其基本概念到高级理论,从纯数学研究到实际应用。我们将从点集拓扑的基础开始,逐步深入到代数拓扑和微分拓扑的复杂世界…