当前位置: 首页 > news >正文

二维数组的定义

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. 概念二维数组就是一种数组的数组&#xff0c;其本质上还是一个一维数组&#xff0c;只是它的数据元素又是一个一维数组。如果你对这个概念想象不出来&#xff0c;给大家举个栗子&#xff0c;相信吸烟的同学一下子就会明白。一根烟 一个变量一包烟 20根烟 一维数组一条烟 …...

SpringMVC--获取请求参数、域对象共享数据

SpringMVC获取请求参数 通过ServletAPI获取 将HttpServletRequest作为控制器方法的形参&#xff0c;此时HttpServletRequest类型的参数表示封装了当前请 求的请求报文的对象 RequestMapping("/testParam") public String testParam(HttpServletRequest request){S…...

2月13日,30秒知全网,精选7个热点

///深圳支持数字经济核心区试点&#xff0c;市民每月免费享有1T网络流量支持基础电信企业、广电企业及互联网企业加快推进全市内容分发网络&#xff08;CDN&#xff09;扩容及智能改造行动&#xff0c;优化和完善CDN节点部署&#xff0c;积极利用边缘计算技术&#xff0c;推动互…...

【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环境中&#xff0c;同时安装了python3.6和python2.7&#xff0c;又安装了ros&#xff0c;最后pip安装包的位置很混乱&#xff0c;安装的包不知道安装在了哪里。使用vscode的时候需要代码提示&#xff0c;就得找到包的路径&#xff0…...

个人收藏学习

【默认收藏夹】 CompletableFuture使用详解&#xff08;全网看这一篇就行&#xff09; 从头开始学MySQL-------存储过程与存储函数&#xff08;4&#xff09; 聊聊支付流程的设计与实现逻辑 聊聊消息中心的设计与实现逻辑 SpringBoot2 整合JTA组件&#xff0c;多数据源事务管理…...

【C++】类和对象---需掌握的功能

目录1.初始化列表1.1构造函数赋值1.2初始化列表格式&#xff1a;编译器执行的顺序&#xff1a;特性&#xff1a;1.3explicit关键字类型替换过程多参数构造函数类型替换&#xff08;C11&#xff09;2.static成员编程题3.匿名对象4.友元4.1友元函数4.2友元类5.内部类6.拷贝对象时…...

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

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

Java面试题-数据库

数据库相关 MySQL的索引使用 默认会有主键索引。 索引分类&#xff1a;单值索引、复合索引、唯一索引 详细文章 MySQL explain 分析 MySQL通过explain关键字分析SQL的执行计划。&#xff08;Oracle通过EXPLAIN PLAN FOR sql&#xff09; IDSELECT_TYPETABLEPARTITIONSTYPEPOSS…...

select 与 where、group by、order by、limit 子句执行优先级比较

当 select 和 其他三种语句的一者或者多者同时出现时&#xff0c;他们之间是存在执行先后顺序的。 他们的优先级顺序是&#xff1a;where > group by > select > order by > limit 目录 1、select 与 where 2、group by 与 where 、select 2、select 与 order…...

【Docker】用开源umami监控你的站点访问量

新年到&#xff0c;祝大家兔年吉祥&#xff01;&#x1f389; 1.介绍 umami是一个开源的站点访问量监看程序&#xff0c;其支持docker部署到自己的服务器上。相比较百度等收费的网站信息监看&#xff0c;这种方式对于小站长来说更加实惠一些 2.docker安装的坑 2.1 docker-co…...

java环境配置

java环境配置步骤下载jdk安装jdk配置环境变量通过控制台命令验证配置是否成功大功告成安装教程&#xff1a; https://blog.csdn.net/m0_37220730/article/details/103585266 下载jdk 若不理解JDK/JRE/JVM的关系&#xff0c;可以点此查看初识Java&#xff08;概念、版本迭代、…...

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背包问题输入格式输出格式数据范围输入样例输出样例&#xff1a;二维一维完全背包问题多重背包问题输入格式输出格式数据范围输入样例输出样例&#xff1a;数据范围二进制优化分组背包问题…...

JVM学习02:内存结构

JVM学习02&#xff1a;内存结构 1. 程序计数器 1.1、定义 Program Counter Register 程序计数器&#xff08;寄存器&#xff09; 作用&#xff1a;是记住下一条jvm指令的执行地址 特点&#xff1a; 是线程私有的不会存在内存溢出 1.2、作用 程序计数器物理上是由寄存器来实…...

6年软件测试经验,从我自己的角度理解自动化测试

接触了不少同行&#xff0c;由于他们之前一直做手工测试&#xff0c;现在很迫切希望做自动化测试&#xff0c;其中不乏工作5年以上的人。 本人从事软件自动化测试已经近6年&#xff0c;从server端到web端&#xff0c;从API到mobile&#xff0c;切身体会到自动化带来的好处与痛楚…...

三种方式查看linux终端terminal是否可以访问外网ping,curl,wget

方法1&#xff1a;ping注意不要用ping www.google.com.hk来验证&#xff0c;因为有墙&#xff0c;墙阻止了你接受网址发回的响应数据。即使你那啥过&#xff0c;浏览器都可以访问Google&#xff0c;terminal里面也是无法得到响应 百度在墙内&#xff0c;所以可以正常拿到响应信…...

【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的基础及应用&#xff0c;基于古月的课&#xff0c;各位可以去看&#xff0c;基于hawkbot{\rm hawkbot}hawkbot机器人进行实际操作。 ROS{\rm ROS}ROS版本&#xff1a;ROS1{\rm ROS1}ROS1的Melodic{\rm Melodic}Melodic&#xff1b;实际机器人&#xff1a;Ha…...

[acwing周赛复盘] 第 90 场周赛20230211 补

[acwing周赛复盘] 第 90 场周赛20230211 补 一、本周周赛总结二、 4806. 首字母大写1. 题目描述2. 思路分析3. 代码实现三、4807. 找数字1. 题目描述2. 思路分析3. 代码实现四、4808. 构造字符串1. 题目描述2. 思路分析3. 代码实现六、参考链接一、本周周赛总结 T1 模拟T2 模拟…...

数组

一、数组中重复的数字题目描述&#xff1a;在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的&#xff0c;但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如&#xff0c;如果输入长度为7的数组{2,3,1…...

MicroBlaze系列教程(4):AXI_UARTLITE的使用

文章目录 @[toc]AXI_UARTLITE简介MicroBlaze添加串口IP常用函数使用示例参考资料工程下载本文是Xilinx MicroBlaze系列教程的第4篇文章。 AXI_UARTLITE简介 axi_uartlite是Xilinx提供axi-lite接口的通用串口IP核,用AXI-Lite总线接口和用户进行交互,速度可以根据不同的芯片调…...

GO 中的 init 函数

前言 go 语言中有一个非常神奇的函数 init ,它可以在所有程序执行开始前被执行&#xff0c;并且每个 package 下面可以存在多个 init 函数&#xff0c;我们一起来看看这个奇怪的 init 函数。 init 特性 init 函数在 main 函数之前执行&#xff0c;并且是自动执行&#xff1b…...

使用C#编写k8s CRD Controller

本文项目地址&#xff1a;k8s-crd - Repos (azure.com)CRDCRD指的是Custom Resource Definition。开发者更多的关注k8s对于容器的编排与调度&#xff0c;这也是k8s最初惊艳开发者的地方。而k8s最具价值的地方是它提供了一套标准化、跨厂商的 API、结构和语义。k8s将它拥有的一切…...

Ansible---playbook剧本

目录 引言&#xff1a;什么是playbook&#xff1f; 一、Playbook 1.1、playbook中的核心元素 1.2、playbook中的基础组件 1.3、playbook格式说明 1.4、实例&#xff1a;httpd服务剧本 二、playbook中的模块 2.1、Templates 模块 2.2、tags 模块 2.3、Roles 模块 引言&…...

Delphi 中TImageCollection和TVirtualImageList 控件实现high-DPI

一、概述RAD Studio允许你通过使用TImageCollection组件和TVirtualImageList组件&#xff0c;在你的Windows VCL应用程序中包含缩放、高DPI、多分辨率的图像。这两个组件位于Windows 10面板中&#xff1a;注意&#xff1a;如果你使用FireMonkey进行跨平台应用&#xff0c;请看T…...

Ros中如何给UR5配置自定义工具 | 在Rviz中给UR5机器人装载定义工具 | UR5配置自定义末端执行器

前言 在学习和项目研究的过程中&#xff0c;我需要在Ur5e上装上工具&#xff0c;以对现实场景进行仿真。网上会有一些装载/配置现成的夹爪&#xff0c;例如Robotiq等。但和我们装载自定义工具的场景还有些差异&#xff0c;因此写一篇博客记录&#xff0c;可能有偏差。如果有问…...

数据库 delete 表数据后,磁盘空间为什么还是被一直占用?

插&#xff1a; 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 坚持不懈&#xff0c;越努力越幸运&#xff0c;大家一起学习鸭~~~ 最近有个上位机获取下位机上报数据的项目&#xff0c…...

docker-微服务篇

docker学习笔记1.docker简介1.1为什么会出现docker&#xff1f;1.2docker理念1.3虚拟机&#xff08;virtual machine&#xff09;1.4容器虚拟化技术1.5一次构建到处运行2.docker安装2.1前提条件2.2docker基本构成2.3docker安装步骤*2.4测试镜像3.docker常用命令3.1 启动docker3…...

石家庄新钥匙做网站/如何在google上免费推广

在企业的相关设置中&#xff0c;若两台物理机&#xff0c;主副之间需要做到文件同步&#xff0c;可以推荐使用Freefilesync作为自动同步设置 话不多说&#xff0c;直接搞机 开始设置好文件比对-点击红色漏斗设置&#xff08;比较/同步&#xff09; 点击确定 手动同步完成 --…...

做电商要注册网站吗/企业网站建设

目录 1. EfficientNet V1存在的问题 2. EfficientNet V2 的亮点 3. EfficientNet V2 网络架构 1. EfficientNet V1存在的问题 针对EfficientNet V1 &#xff0c;作者提出了以下的三个缺点 当训练图像的size很大时&#xff0c;网络中传递的特征图尺寸就会很大&#xff0c;这…...

手机网站建设比较好的公司/临沂seo公司

最近在看JVM虚拟机&#xff0c;想要搞懂虚拟机的内部运行机制&#xff0c;指令码的分析是必不可少的&#xff01;来看一个简单的测试小程序&#xff0c;看看里面的运行机制&#xff01;这里就需要借助javap命令去查看了&#xff01; 第一步&#xff0c;创建一个简单的测试程序…...

wordpress建站主题/百度搜索官网

取(m堆)石子游戏 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1466 Accepted Submission(s): 853 Problem Descriptionm堆石子,两人轮流取.只能在1堆中取.取完者胜.先取者负输出No.先取者胜输出Yes,然后输出…...

山东建设公司网站/360站长平台链接提交

先需求分析一下---传统的web应用是在线应用&#xff0c;这其实也是web的特色&#xff0c;对于PC时代问题并不大&#xff0c;但到了移动互联网时代&#xff0c;设备终端位置不再固定&#xff0c;依赖无线信号&#xff0c;网络的可靠性变得更低。比如&#xff1a;在火车上&#x…...

一 网站建设的目的和目标/软文范例大全1000字

转&#xff1a;http://www.myexception.cn/javascript/871757.html 什么是 JavaScript&#xff1f;你该如何执行它 什么是 JavaScript&#xff1f;你该如何执行它&#xff1f; JavaScript 是一种基于文本的程序设计语言&#xff0c;在被执行之前不需要进行任何转换。其它程…...