二维数组的定义

news2024/9/22 17:22:48

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]就相当于是在访问二维数组中的第一个一维数组的首地址,这样就可以得到第一个一维数组。

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

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

相关文章

TIA博途中DB数据块清零的具体方法示例

TIA博途中DB数据块清零的具体方法示例 TIA中数据块如何实现清零? 在TIA指令集内有多个移动指令可对DB块内数据进行清零处理。对于S7-1500 CPU或ET200SP CPU来说,可使用BLKMOV、FILL以及SCL的POKE_BLK指令。但是这些指令对DB块清零时,要求DB块必需为非优化DB。 对于优化的DB…

国内ChatGPT日趋成熟后,可以优先解决的几个日常小问题

现在ChatGPT的发展可谓如日中天&#xff0c;国内很多大的公司例如百度、京东等也开始拥抱新技术&#xff0c;推出自己的应用场景&#xff0c;但可以想象到的是&#xff0c;他们必定利用这个新技术在巩固自己的现有应用场景&#xff0c;比如某些客服&#xff0c;你都不用想&…

Android 进阶——Framework 核心之Binder 对象及其生命周期小结(四)

文章大纲引言一、Binder概述二、Binder 对象三、Binder 对象生命周期的管理1、Binder本地对象&#xff08;BBinder&#xff09;的生命周期管理2、Binder 实体对象&#xff08;binder_node&#xff09;生命周期的管理3、Binder 引用对象&#xff08;binder_ref&#xff09;生命周…

ChatGPT入门案例|商务智能对话客服(一)

ChatGPT是人工智能研究实验室OpenAI新推出的一种人工智能技术驱动的自然语言处理工具&#xff0c;使用了Transformer神经网络架构&#xff0c;也是GPT-3.5架构&#xff0c;这是一种用于处理序列数据的模型&#xff0c;拥有语言理解和文本生成能力&#xff0c;尤其是它会通过连接…

32个关于FPGA的学习网站

语言类学习网站 1、HDLbits 网站地址&#xff1a;https://hdlbits.01xz.net/wiki/Main_Page 在线作答、编译的学习Verilog的网站&#xff0c;题目很多&#xff0c;内容丰富。非常适合初学Verilog的人&#xff01;&#xff01;&#xff01; 2、牛客网 网站地址&#xff1a;http…

2.12、进程互斥的软件实现方法

学习提示: 理解各个算法的思想、原理结合上小节学习的 “实现互斥的四个逻辑部分”&#xff0c;重点理解各算法在进入区、退出区都做了什么分析各算法存在的缺陷&#xff08;结合 “实现互斥要遵循的四个原则” 进行分析&#xff09; 1、单标志法 算法思想&#xff1a;两个进…

SonicWall:请立即修复SMA 1000 漏洞

近日&#xff0c;网络安全供应商SonicWall发布了关于安全移动访问 (SMA) 1000设备的三个安全漏洞的紧急报告&#xff0c;其中包括一个高威胁性的身份验证绕过漏洞。SonicWall指出&#xff0c;攻击者可以利用这些漏洞绕过授权&#xff0c;并可能破坏易受攻击的设备。 从报告中可…

Cow Acrobats ( 临项交换贪心 )

题目大意&#xff1a; N 头牛 &#xff0c; 每头牛有一个重量(Weight)和一个力量(Strenth) &#xff0c; N头牛进行排列 &#xff0c; 第 i 头牛的风险值为其上所有牛总重减去自身力量 &#xff0c; 问如何排列可以使最大风险值最小 &#xff0c; 求出这个最小的最大风险值&am…

Java JCP

Java JCP目录概述需求&#xff1a;设计思路参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wait for change,challenge Survive. happy for hardess to solv…

GIS在地质灾害危险性评估与灾后重建中的实践技术应用及python机器学习灾害易发性评价模型建立与优化

地质灾害是指全球地壳自然地质演化过程中&#xff0c;由于地球内动力、外动力或者人为地质动力作用下导致的自然地质和人类的自然灾害突发事件。由于降水、地震等自然作用下&#xff0c;地质灾害在世界范围内频繁发生。我国除滑坡灾害外&#xff0c;还包括崩塌、泥石流、地面沉…

手动部署ECS线上数据库及使用

文章参考自手动部署MySQL数据库&#xff08;CentOS 7&#xff09; (aliyun.com)MySQL是一个关系型数据库管理系统&#xff0c;常用于LAMP和LNMP等网站场景中。本教程介绍如何在Linux系统ECS实例上安装、配置以及远程访问MySQL数据库。前提条件已创建一台ECS实例。具体操作&…

[ 常用工具篇 ] CobaltStrike(CS神器)基础(一) -- 安装及设置监听器详解

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

YOLO-V5轻松上手

之前介绍了YOLO-V1~V4版本各做了哪些事以及相较于之前版本的改进。有的人或许会想“直接学习最近版本的算法不好吗”&#xff0c;在我看来&#xff0c;每一个年代的版本/算法都凝聚着当年学术界的智慧&#xff0c;即便是它被淘汰了也依旧有值得思考的地方&#xff0c;或是可以使…

工业无线物联网解决方案中的缺陷可让攻击者深入访问OT网络

运营技术 (OT) 团队通常通过无线和蜂窝解决方案将工业控制系统 (ICS) 连接到远程控制和监控中心&#xff0c;这些解决方案有时带有供应商运行的基于云的管理界面。 这些连接解决方案&#xff0c;也称为工业无线物联网设备&#xff0c;增加了 OT 网络的攻击面&#xff0c;并且可…

CentOS8基础篇6:文件属性的读取和修改

一、文件属性 每一行代表对应文件或目录的详细信息。从左到右具体的含义是文件属性、文件数、拥有者、所属的组、文件大小、建立月份、建立日期、建立年份或时间、以及文件名。其中“建立年份或时间”字段&#xff0c;如果文件是今年建立的&#xff0c;则显示具体时间&#xf…

文献阅读笔记 # GraphCodeBERT: Pre-training Code Representations with Data Flow

《GraphCodeBERT: Pre-training Code Representations with Data Flow》ICLR 2021 (TH-CPL A会&#xff0c;公认顶会&#xff0c;但未上 CCF 榜)作者部分与 CodeBERT 重叠&#xff0c;主要来自 MSRA Intern 和 MSRA 研究员&#xff0c;学生来自国内多个顶尖高校。资源&#xff…

java 黑马头条 day3 实名认证分布式事务问题 seata

1 完善实名认证功能 1.1 实名认证分布式事务问题 1.1.1 问题分析 在昨天的实名认证代码中&#xff0c;审核完毕后添加 id5的演示异常&#xff0c;重新使用postman进行测试, 会发现 出现异常后 本地方法因为有 Transactional注解 对ap_user ap_user_realname的操作会回滚 而…

【Docker】配置lsky pro兰空图床

Docker 部署 lsky pro 兰空图床的教程 本文首发于 慕雪的寒舍 1.使用Docker部署 命令比较简单&#xff0c;用下面的即可 docker run -d \ --name lsky \ -p 14728:80 \ -v /root/docker/lsky:/var/www/html \ halcyonazure/lsky-pro-docker:latest--name 设置容器名字为 lsky…

基于VS调试分析 + 堆栈观察问题代码段

文章目录问题代码段1 —— 阶乘之和问题代码段2 —— 越界的危害① 发现问题② 分析问题③ 思考问题【⭐堆栈原理⭐】④ 解决问题【DeBug与Release】&#x1f468;程序员与测试人员&#x1f469;✒总结与提炼问题代码段1 —— 阶乘之和 先来看一道C语言中比较基础的题目&#x…

新能源汽车PK燃油汽车,首次胜出,输赢真的那么重要?

新能源汽车PK燃油汽车&#xff0c;输赢真的那么重要&#xff1f;是的。【科技明说 &#xff5c; 每日看点】今天看到一个新能源汽车领域的消息&#xff0c;我觉得很有意思&#xff0c;是说中国新能源汽车满意度水平首次超过了燃油汽车&#xff0c;你们觉得是这样么&#xff1f;…