二维数组及其内存图解

二维数组

        在一维数组的介绍当中曾说,数组中可以储存任何同类型的元素,那么这个元素是不是可以也是数组呢?答案是可以,即在数组之中储存数组元素。这种情况就是多维数组,当一个数组中的元素是数组时叫做二维数组,当这个数组中的数组元素的元素仍然是数组时叫做三位数组,依次类推可以得到n维数组。不过通常的使用中一般只用到二位数组。

        二维数组的定义与一位数组的定义相似,可以通过语句:

        1、数据类型 [ ] [ ] 数组名称 = new [一维数组的长度] [ ]; 

        2、数据类型  数组名称 [ ] [ ] = new [一维数组的长度] [ ];

        3、数据类型  [ ] [ ] = new 数据类型 [ ] [ ]{数组1,数组2,数组3,……};

        4、数据类型 [ ] [ ] ={ 数组1,数组2,数组3,……};

四个语句来定义,同样在这四个数组中,第2个语句是第一个语句的变体,第3个语句和第4个语句当中需要注意输入的是数组元素即可,并且这里要注意的是,在第1个语句和第2个语句中“一维数组的长度”是必不可少的,但是第二个[ ]中是不能添加长度的。

        对于二位数组的访问,可以访问其中的某一个数组,也可访问到具体单个元素,比如在二维数组中arr[0]表示的是一个数组,当进行输出打印时,结果是一个一维数组,而arr[0][0]表示的是在二维数组中的第一行的第一个元素。掌握了这个访问规则,就可以对二维数组中的元素进行遍历,可以直接进行遍历,也可以采用嵌套循环来遍历。比如下面的这个程序所示:

package cn.luoyusanshu.array;
import java.util.Arrays;
public class Test05 {public static void main(String[] args) {//第1个语句创建二维数组int[][] arr01 = new int[3][];arr01[0] =new int[] {1,5,6};arr01[1] = new int[] {1,5,8,7};arr01[2] = new int[] {4,9,66};//第2个语句创建二位数组int arr02[][]=new int[3][];arr02[0] = new int[]{1,6,8,9};arr02[1] = new int[]{8,69,8,9};arr02[2] = new int[]{5,6,8,79};//第3个语句创建二维数组int[][] arr03 = new int[][]{{1,2,9},arr02[1],arr02[2]};//第4个语句创建二维数组int[][] arr04 = {{0,2,5},{3,6,9,6},{4,8,11,22}};//访问二维数组中的元素System.out.println("二维数组arr0的第一个数组元素为:"+Arrays.toString(arr01[0]));System.out.println("二维数组arr01的第一个元素为:"+arr01[0][0]);System.out.println("二维数组arr01的长度为:"+arr01.length);System.out.println("二维数组arr01的第一个数组元素的长度为:"+arr01[0].length);}}

数组的内存图解

        在java中将内存分为栈、堆、方法区三大块,其中方法区用来储存可运行的class文件,包括方法、静态成员、常量等;栈是方法运行时的内存,也就说在运行方法时才会调用此处内存,在栈中开辟空间时是连续开辟的,和电影胶带有些相似,因此运行时开辟的空间叫这个方法在栈中对应的栈帧。栈的特点是“先进后出”,比如main方法是最先开辟栈帧的方法,但是它却是最后一个退出栈空间的方法。推内存够用于储存对象以及数组。数组在推内存中被储存时用来接收数组的变量(如arr)接收的是数组所在内存的地址值,而不是数组中元素的实际值,因此数组是引类型,如果要对一个数组进行初始化,要用null关键字进行赋值。

        接下来用一个程序来分析二维数组在内存中的储存进行分析,用以加深对数组也是对象的理解。

package cn.luoyusanshu.array;public class Test08 {public static void main(String[] args) {int[][] arr = new int[3][];arr[0]=new int[2];arr[1]=new int[3];arr[2]=new int[2];}
}

        在这个程序的内存分析中只用到了 栈内存和堆内存两块,程序开始时,从main方法开始运行,创建数组之前先在main方法的栈帧中创建了一个变量,由于未进行赋值,它的值为默认值,因为创建的是数组,所以它的默认值为null。随后遇到关键字new,于是想堆内存申请开辟空间,假设这个空间的地址为0x0011,这时会按照创建的数组大小在推内存中开辟相应的空间,并将空间的地址传给arr变量。但由于创建数组时并未进行赋值操作,为默认初始化,所以数组元素的值为默认值,又因为二维数组中的元素为数组类型,因此此时的默认值为null。

        接下来对数组中的元素进行赋值操作,在下面的三行代码都采用了new关键字,因此会向推内存申请开辟三个空间,与这三个空间对应的地址分别为 0x0021、0x0031、0x0022。由于创建的为int类型的数组对象,并且未进行赋值操作,因此元素的值为默认值0。同时开辟的这三个空间的地址会返回给对应的一位数组对应的元素,如下图所示。

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/801771.shtml

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

相关文章

《系统架构设计师教程(第2版)》第8章-系统质量属性与架构评估-03-ATAM方法架构评估实践(下)

文章目录 3. 测试阶段3.1 头脑风暴和优先场景(第7步)3.1.1 理论部分3.1.2 示例 3.2 分析架构方法(第8步)3.2.1 调查架构方法1)安全性2)性能 3.2.2 创建分析问题3.2.3 分析问题的答案胡佛架构银行体系结构 3…

222222222222222222222222

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和…

2024年MathorCup+认证杯数模竞赛助攻规划+竞赛基本信息介绍

为了更好的帮助大家助攻未来几天的竞赛,除了给大家上次提供的2024年上半年数学建模竞赛一览表(附赠12场竞赛的优秀论文格式要求) 又为大家提供了本周末两场数模竞赛2023年的竞赛题目以及优秀论文,希望能对大家本周末的竞赛有所帮…

《C语言深度解剖》(4):深入理解一维数组和二维数组

🤡博客主页:醉竺 🥰本文专栏:《C语言深度解剖》 😻欢迎关注:感谢大家的点赞评论关注,祝您学有所成! ✨✨💜💛想要学习更多数据结构与算法点击专栏链接查看&am…

3D Web轻量引擎HOOPS Communicator装配制造流程演示

介绍 该演示介绍了使用HOOPS Communicator的独特工作流程,该工作流程从零件列表中加载零件,并使用自定义配合操作符(例如共线、同心和共面)构建装配模型。该工作流程可用于各种行业,例如维护手册、工作指令或电子商务…

BMS基础之锂电池充放电特性

磷酸铁锂电池 它充电在3.3V以后,会有一个猛地增加,所以3.3v其实就是他的饱和电压,如果继续充电就会损坏电池,同理放电到一定程度电压就会急剧下降,过放也会损坏电池(充放电截止电压) 三元锂电…

Social Skill Training with Large Language Models

Social Skill Training with Large Language Models 关键字:社交技能训练、大型语言模型、人工智能伙伴、人工智能导师、跨学科创新 摘要 本文探讨了如何利用大型语言模型(LLMs)进行社交技能训练。社交技能如冲突解决对于有效沟通和在工作和…

线程的666种状态

文章目录 在Java中,线程有以下六种状态: NEW:新建状态,表示线程对象已经被创建但还未启动。RUNNABLE:可运行状态,表示线程处于就绪状态,等待系统分配CPU资源执行。BLOCKED:阻塞状态…

SpringBoot的旅游管理系统+论文+ppt+免费远程调试

项目介绍: 基于SpringBoot旅游网站 旅游管理系统 本旅游管理系统采用的数据库是Mysql,使用SpringBoot框架开发。在设计过程中,充分保证了系统代码的良好可读性、实用性、易扩展性、通用性、便于后期维护、操作方便以及页面简洁等特点。 (1&…

想进阶为 Go 语言高级开发工程师吗?那么,一定要阅读此文!

大家好,我是孔令飞,字节跳动云原生开发专家、前腾讯云原生技术专家;《企业级Go项目开发实战》作者,云原生实战营 知识星球星主; 我们知道,Go 出自名门 Google 公司,是一门支持并发、垃圾回收的编…

如何快速开启一个项目-ApiHug - API design Copilot

ApiHug101-001开启篇 🤗 ApiHug {Postman|Swagger|Api...} 快↑ 准√ 省↓ GitHub - apihug/apihug.com: All abou the Apihug apihug.com: 有爱,有温度,有质量,有信任ApiHug - API design Copilot - IntelliJ IDEs Plugin |…

ClickHouse 介绍

前言 一个通用系统意味着更广泛的适用性,但通用的另一种解释是平庸,因为它无法在所有场景内都做到极致。 ClickHouse 在没有像三驾马车这样的指导性论文的背景下,通过针对特定场景的极致优化,获得闪电般的查询性能。 ClickHous…

[StartingPoint][Tier2]Oopsie

Task 1 With what kind of tool can intercept web traffic? (哪种工具可以拦截web数据包) proxy Task 2 What is the path to the directory on the webserver that returns a login page? (路径到返回登录页面的 Web 服务器目录是什么?) /cdn-cgi/login Tas…

标定系列——Ubuntu18.04下opencv-4.5.3与opencv_contrib-4.5.3源码编译(二十)

Ubuntu18.04下opencv-4.5.3与opencv_contrib-4.5.3源码编译 说明下载安装步骤1.更新2.安装必要的依赖包3.下载源码包并解压4.终端运行如下命令5.添加配置路径6.验证安装是否成功 说明 Ubuntu18.04下对opencv-4.5.3与opencv_contrib-4.5.3源码编译 下载 CSDN下载 安装步骤 …

基于单片机数码管20V电压表仿真设计

**单片机设计介绍,基于单片机数码管20V电压表仿真设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机数码管20V电压表仿真设计的主要目的是通过单片机和数码管显示电路实现一个能够测量0到20V直流电压的电…

如果用大模型考公,kimi、通义千问谁能考高分?

都说大模型要超越人类了,今天就试试让kimi和通义千问做公务员考试题目,谁能考高分? 测评结果再次让人震惊! 问题提干:大小两种规格的盒装鸡蛋,大盒装23个,小盒装16个,采购员小王买了…

【鸿蒙开发】系统组件Row

Row组件 Row沿水平方向布局容器 接口: Row(value?:{space?: number | string }) 参数: 参数名 参数类型 必填 参数描述 space string | number 否 横向布局元素间距。 从API version 9开始,space为负数或者justifyContent设置为…

用vue.js写案例——ToDoList待办事项 (步骤和全码解析)

目录 一.准备工作 二.编写各个组件的页面结构 三.实现初始任务列表的渲染 四.新增任务 五.删除任务 六.展示未完成条数 七.切换状态-筛选数据 八.待办事项(全)代码 一.准备工作 在开发“ToDoList”案例之前,需要先完成一些准备工作&a…

电力变压器数据集介绍和预处理

1 电力变压器数据集介绍 1.1 数据背景 在这个Github仓库中,作者提供了几个可以用于长序列时间序列问题的数据集。所有数据集都经过了预处理,并存储为.csv文件。数据集的范围从2016/07到2018/07。 ETT-small: 含有2个电力变压器(来自2个站点…

React - 你使用过高阶组件吗

难度级别:初级及以上 提问概率:55% 高阶组件并不能单纯的说它是一个函数,或是一个组件,在React中,函数也可以做为一种组件。而高阶组件就是将一个组件做为入参,被传入一个函数或者组件中,经过一定的加工处理,最终再返回一个组件的组合…