二维数组的定义
1. 概念
二维数组就是一种数组的数组,其本质上还是一个一维数组,只是它的数据元素又是一个一维数组。如果你对这个概念想象不出来,给大家举个栗子,相信吸烟的同学一下子就会明白。
一根烟 = 一个变量
一包烟 = 20根烟 = 一维数组
一条烟 = 10包烟 = 二维数组
也就是说,我们买的”一条烟“,就是一种”二维数组“,明白了吧?
2. 定义
定义二维数组的基本语法如下:
定义方式一:
元素类型[][] 数组名称;
定义方式二:
元素类型 数组名称[][];
在开发时,第一种定义方式更常用一些。这是数组的定义,我们还要对数组进行初始化。二维数组在初始化时,也分为动态初始化和静态初始化两种情况。我们可以把数组的定义和初始化在多条语句中分开完成,也可以直接放在一个语句中完成。
3. 初始化
3.1 动态初始化
二维数组进行动态初始化时,语法格式如下:
元素类型[][] 数组名称 = new 元素类型[二维数组的长度][一维数组的长度];
例如:
int[][] arr = new int[3][4];
在上述示例中,表示我们定义了一个整型的二维数组arr。3表示在二维数组中有3个一维数组,每个一维数组就是一行;4表示每个一维数组中有4个数据元素,这样就形成了二维数组的4列。这样我们就可以把这个二维数组arr看成是一个3行4列的数组或矩阵,访问二维数组中的某个元素时,需要使用arr[row][col]的形式。所以二维数组中,总的元素个数最多有3*4=12个。
以下是动态初始化的案例代码。
publicclassDemo15 {publicstaticvoidmain(String[] args) {// 二维数组--动态初始化//二维数组在动态初始化时,必须指定二维数组的长度。//创建一个包含了3个一维数组的二维数组,每个一维数组的长度是2。int[][] arr2 = newint[3][2];//给二维数组赋值//给二维数组中的第一个一维数组赋值arr2[0][0] = 111;arr2[0][1] = 222;//给二维数组中的第二个一维数组赋值arr2[1][0] = 333;arr2[1][1] = 444;//给二维数组中的第三个一维数组赋值arr2[2][0] = 555;arr2[2][1] = 666;//二维数组取值System.out.println( "二维数组中第一个元素里的第一个元素"+arr2[0][0]);System.out.println( "二维数组中第一个元素里的第二个元素"+arr2[0][1]);System.out.println( "二维数组中第二个元素里的第一个元素"+arr2[1][0]);System.out.println( "二维数组中第二个元素里的第二个元素"+arr2[1][1]);//获取二维数组的长度System.out.println("二维数组的长度"+arr2.length);System.out.println("二维数组中第一个一维数组的长度"+arr2[0].length);System.out.println("二维数组中第二个一维数组的长度"+arr2[1].length);System.out.println("二维数组中第三个一维数组的长度"+arr2[2].length);}}注意:我们在对二维数组进行动态初始化时,必须先指定出二维数组的长度,但一维数组的长度可以后续使用前再单独指定。
3.2 静态初始化
二维数组中,每个一维数组的长度并不要求相同,可以各不相同。二维数组进行静态初始化时,语法格式如下:
元素类型[][] 数组名称 = new 元素类型[][]{{一维数组1,一维数组2,一维数组3....};
例如:
int[][] arr = new int[][]{{2,3},{5,2,1},{10,45,22,54}};
但是这种方式的语法显得有些啰嗦,所以在实际开发时,我们一般是采用简化的静态初始化方式,如下所示:
元素类型[][] 数组名称 =m{{一维数组1,一维数组2,一维数组3....};
例如:
int[][] arr = {{2,3},{5,2,1},{10,45,22,54}};
以下是静态初始化的案例代码。
publicclassDemo16 {publicstaticvoidmain(String[] args) {// 二维数组--静态初始化//静态初始化一个二维数组。静态初始化时可以很灵活int[][] arr = {{11,22,33},{66,88}};//给二维数组赋值。//重新给二维数组中第一个一维数组里的第3个数据元素(即33)赋值,用99替换原来的33.arr[0][2] = 99;//重新给二维数组中第二个一维数组里的第1个数据元素(即66)赋值,用77替换原来的66.arr[1][0] = 77;//二维数组取值System.out.println( "二维数组中第一个一维数组里的第一个元素"+arr[0][0]);System.out.println( "二维数组中第一个一维数组里的第二个元素"+arr[0][1]);System.out.println( "二维数组中第二个一维数组里的第三个元素"+arr[0][2]);System.out.println( "二维数组中第二个一维数组里的第一个元素"+arr[1][0]);System.out.println( "二维数组中第二个一维数组里的第二个元素"+arr[1][1]);//获取二维数组的长度System.out.println("二维数组中的长度"+arr.length);System.out.println("二维数组中第一个一维数组的长度"+arr[0].length);System.out.println("二维数组中第二个一维数组的长度"+arr[1].length);}}以上是定义和初始化二维数组的基本案例,为了加深大家对二维数组的理解,接下来壹哥再设计几个代码案例,巩固二维数组的用法。
4. 扩展案例
4.1 动态初始化的变形写法
如果我们在定义二维数组时,没有给定一维数组的长度,那么在使用数组之前,一定要先对一维数组进行初始化。否则,此时如果直接使用一维数组,就会产生空指针异常java.lang.NullPointerException。
publicclassDemo17 {publicstaticvoidmain(String[] args) {//动态初始化时未限定一维数组的长度int[][] arr = newint[3][];//如果我们在定义二维数组时,没有给定一维数组的长度,那么在使用数组之前,一定要初始化里面的一维数组。//否则,如果直接使用一维数组,就会产生空指针异常java.lang.NullPointerException// arr3[0][0] = 100;//初始化一维数组arr[0] = newint[2];arr[1] = newint[1];arr[2] = newint[4];//给数组赋值arr[0][0] = 1;arr[0][1] = 2;arr[1][0] = 10;arr[2][0] = 100;arr[2][1] = 200;arr[2][2] = 300;arr[2][3] = 400;// 二维数组取值System.out.println("二维数组中的第一个元素中的第一个元素" + arr[0][0]);System.out.println("二维数组中的第一个元素中的第二个元素" + arr[0][1]);System.out.println("二维数组中的第二个元素中的第一个元素" + arr[1][0]);}}arr[0]=new int[2] 和 arr[1]=new int[1]是在为最高维分配引用空间,也就是限制了最高维能保存数据的最大长度。
4.2 遍历二维数组
因为二维数组中包含若干个一维数组,我们之前遍历一维数组时要使用一个循环,所以我们对二维数组进行遍历时就要使用嵌套的双重循环。当然,for/while/foreach等循环都可以使用。
publicclassDemo18 {publicstaticvoidmain(String[] args) {// 二维数组--遍历//定义一个二维数组int[][] arr = {{11,22,33},{55,66},{77,88,99}};//使用双重for循环,遍历二维数组//第一层循环:遍历二维数组中有几个一维数组for (int i = 0; i < arr.length; i++) {//arr[i]是一维数组//第二层循环:遍历每个一维数组for(int j = 0 ; j < arr[i].length ; j++) {System.out.println("二维数组中第"+(i+1)+"个一维数组里的元素"+arr[i][j]);}}}}5. 内存分析
对于一个二维数组来说,比如int[][] array={{10,0,0,20,0},{0,30,40,0,0},{0,0,0,0,0}};这个二维数组的结构如下图所示:

array[0]会获取array数组的第1个元素,因为array数组的每个元素都是一个一维数组,因此array[0]指向的数组就是{ 10, 0, 0, 20, 0 },其他的以此类推。
高维数组中的每个数据元素,保存的是低位数组的首地址。所以我们访问array[0]就相当于是在访问二维数组中的第一个一维数组的首地址,这样就可以得到第一个一维数组。
相关文章:
二维数组的定义
1. 概念二维数组就是一种数组的数组,其本质上还是一个一维数组,只是它的数据元素又是一个一维数组。如果你对这个概念想象不出来,给大家举个栗子,相信吸烟的同学一下子就会明白。一根烟 一个变量一包烟 20根烟 一维数组一条烟 …...
SpringMVC--获取请求参数、域对象共享数据
SpringMVC获取请求参数 通过ServletAPI获取 将HttpServletRequest作为控制器方法的形参,此时HttpServletRequest类型的参数表示封装了当前请 求的请求报文的对象 RequestMapping("/testParam") public String testParam(HttpServletRequest request){S…...
2月13日,30秒知全网,精选7个热点
///深圳支持数字经济核心区试点,市民每月免费享有1T网络流量支持基础电信企业、广电企业及互联网企业加快推进全市内容分发网络(CDN)扩容及智能改造行动,优化和完善CDN节点部署,积极利用边缘计算技术,推动互…...
【C++设计模式】学习笔记(2):模式分类与模版方法 Template Method
目录 简介模式分类GOF-23 模式分类从封装变化角度对模式分类重构获得模式 Refactoring to Patterns重构关键技法“组件协作”模式Template Method 模式动机(Motivation)结构化软件设计流程面向对象软件设计流程早绑定与晚绑定模式的定义结构(Structure)要点总结结语简介 He…...
【Swift 60秒】92 - Nil coalescing
0x00 Lesson The nil coalescing operator unwraps an optional and returns the value inside if there is one. If there isn’t a value - if the optional was nil - then a default value is used instead. Either way, the result won’t be optional: it will either b…...
python pip安装的包的路径
以ubuntu为例从一个店家那里拿到的一个ubuntu环境中,同时安装了python3.6和python2.7,又安装了ros,最后pip安装包的位置很混乱,安装的包不知道安装在了哪里。使用vscode的时候需要代码提示,就得找到包的路径࿰…...
个人收藏学习
【默认收藏夹】 CompletableFuture使用详解(全网看这一篇就行) 从头开始学MySQL-------存储过程与存储函数(4) 聊聊支付流程的设计与实现逻辑 聊聊消息中心的设计与实现逻辑 SpringBoot2 整合JTA组件,多数据源事务管理…...
【C++】类和对象---需掌握的功能
目录1.初始化列表1.1构造函数赋值1.2初始化列表格式:编译器执行的顺序:特性:1.3explicit关键字类型替换过程多参数构造函数类型替换(C11)2.static成员编程题3.匿名对象4.友元4.1友元函数4.2友元类5.内部类6.拷贝对象时…...
2.12、进程互斥的软件实现方法
学习提示: 理解各个算法的思想、原理结合上小节学习的 “实现互斥的四个逻辑部分”,重点理解各算法在进入区、退出区都做了什么分析各算法存在的缺陷(结合 “实现互斥要遵循的四个原则” 进行分析) 1、单标志法 算法思想:两个进…...
Java面试题-数据库
数据库相关 MySQL的索引使用 默认会有主键索引。 索引分类:单值索引、复合索引、唯一索引 详细文章 MySQL explain 分析 MySQL通过explain关键字分析SQL的执行计划。(Oracle通过EXPLAIN PLAN FOR sql) IDSELECT_TYPETABLEPARTITIONSTYPEPOSS…...
select 与 where、group by、order by、limit 子句执行优先级比较
当 select 和 其他三种语句的一者或者多者同时出现时,他们之间是存在执行先后顺序的。 他们的优先级顺序是:where > group by > select > order by > limit 目录 1、select 与 where 2、group by 与 where 、select 2、select 与 order…...
【Docker】用开源umami监控你的站点访问量
新年到,祝大家兔年吉祥!🎉 1.介绍 umami是一个开源的站点访问量监看程序,其支持docker部署到自己的服务器上。相比较百度等收费的网站信息监看,这种方式对于小站长来说更加实惠一些 2.docker安装的坑 2.1 docker-co…...
java环境配置
java环境配置步骤下载jdk安装jdk配置环境变量通过控制台命令验证配置是否成功大功告成安装教程: https://blog.csdn.net/m0_37220730/article/details/103585266 下载jdk 若不理解JDK/JRE/JVM的关系,可以点此查看初识Java(概念、版本迭代、…...
Linux系统服务:Apache安装及配置应用
目录 一、Apache安装 1、Apache简介 2、Yum安装 3、编译安装 4、服务管理 5、编译安装实现systemctl服务管理 二、Apache配置应用 1、基础应用 2、隐藏版本号 3、更改监听端口 一、Apache安装 1、Apache简介 Apache即阿帕奇是一款开源的、世界使用排名第一的Web服务…...
动态规划(Dynamic Programming)——背包问题
动态规划(Dynamic Programming) 背包问题 目录动态规划(Dynamic Programming)背包问题01背包问题输入格式输出格式数据范围输入样例输出样例:二维一维完全背包问题多重背包问题输入格式输出格式数据范围输入样例输出样例:数据范围二进制优化分组背包问题…...
JVM学习02:内存结构
JVM学习02:内存结构 1. 程序计数器 1.1、定义 Program Counter Register 程序计数器(寄存器) 作用:是记住下一条jvm指令的执行地址 特点: 是线程私有的不会存在内存溢出 1.2、作用 程序计数器物理上是由寄存器来实…...
6年软件测试经验,从我自己的角度理解自动化测试
接触了不少同行,由于他们之前一直做手工测试,现在很迫切希望做自动化测试,其中不乏工作5年以上的人。 本人从事软件自动化测试已经近6年,从server端到web端,从API到mobile,切身体会到自动化带来的好处与痛楚…...
三种方式查看linux终端terminal是否可以访问外网ping,curl,wget
方法1:ping注意不要用ping www.google.com.hk来验证,因为有墙,墙阻止了你接受网址发回的响应数据。即使你那啥过,浏览器都可以访问Google,terminal里面也是无法得到响应 百度在墙内,所以可以正常拿到响应信…...
【Call for papers】SIGCOMM-2023(CCF-A/计算机网络/2023年2月15日截稿)
ACM SIGCOMM is the flagship annual conference of the ACM Special Interest Group on Data Communication (SIGCOMM). ACM SIGCOMM 2023, the 37th edition of the conference series, will be held in New York City, US, September 10 - 14, 2023. 文章目录1.会议信息2.时…...
Chapter5:机器人感知
ROS1{\rm ROS1}ROS1的基础及应用,基于古月的课,各位可以去看,基于hawkbot{\rm hawkbot}hawkbot机器人进行实际操作。 ROS{\rm ROS}ROS版本:ROS1{\rm ROS1}ROS1的Melodic{\rm Melodic}Melodic;实际机器人:Ha…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
C# 表达式和运算符(求值顺序)
求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...
渗透实战PortSwigger靶场:lab13存储型DOM XSS详解
进来是需要留言的,先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码,输入的<>当成字符串处理回显到页面中,看来只是把用户输…...
前端高频面试题2:浏览器/计算机网络
本专栏相关链接 前端高频面试题1:HTML/CSS 前端高频面试题2:浏览器/计算机网络 前端高频面试题3:JavaScript 1.什么是强缓存、协商缓存? 强缓存: 当浏览器请求资源时,首先检查本地缓存是否命中。如果命…...
