Java中二维数组的正确使用方法介绍
作者:一一哥Sun 发布时间:2023-11-19 16:14:18
一. 多维数组
1. 概念
多维数组可以看成是数组的数组。 比如二维数组就是一个特殊的一维数组,它的每个元素都是一个一维数组。其他多维数组的概念,大家可以参照二维数组以此类推。
2. 分类
多维数组可以分为:
二维数组;
三维数组;
其他数组;
其实我们在开发时,真正常用的数组也就是一维数组和二维数组,更多维度的数组很少使用。所以接下来在本篇文章中,主要是给大家讲解二维数组相关的内容。
二. 二维数组
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个。
以下是动态初始化的案例代码。
/**
* @author
*/
public class Demo15 {
public static void main(String[] args) {
// 二维数组--动态初始化
//二维数组在动态初始化时,必须指定二维数组的长度。
//创建一个包含了3个一维数组的二维数组,每个一维数组的长度是2。
int[][] arr2 = new int[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}};
以下是静态初始化的案例代码。
/**
* @author
*/
public class Demo16 {
public static void main(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。
/**
* @author
*/
public class Demo17 {
public static void main(String[] args) {
//动态初始化时未限定一维数组的长度
int[][] arr = new int[3][];
//如果我们在定义二维数组时,没有给定一维数组的长度,那么在使用数组之前,一定要初始化里面的一维数组。
//否则,如果直接使用一维数组,就会产生空指针异常java.lang.NullPointerException
// arr3[0][0] = 100;
//初始化一维数组
arr[0] = new int[2];
arr[1] = new int[1];
arr[2] = new int[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等循环都可以使用。
/**
* @author 一一哥Sun
*/
public class Demo18 {
public static void main(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]就相当于是在访问二维数组中的第一个一维数组的首地址,这样就可以得到第一个一维数组。
三. 多维数组
理论上,在Java中我们可以定义出任意维度的数组。但高于二维的多维数组,在实际开发中很少使用,大家知道Java中支持这种数据结构即可。如果你感兴趣,可以尝试着自己构造一个三维数组出来,就不在这里过多讲解啦,可以参考如下:
//动态初始化
int[][][] arr= new int[3][3][2];
//静态初始化
int[][][] arr2= {
{
{1,2,3},{4,5,6},{7,8,9}
},
{
{1,2},{3,4}
},
{
{1,2},{3,4,5}
}
};
四. 结语
至此,就把二维数组的内容给大家介绍完了,现在你知道如何使用二维数组了吗?二维数组的定义、动态和静态初始化、内存分析都是今天的重点,大家要牢牢掌握哦。
来源:https://juejin.cn/post/7204480721435361335
猜你喜欢
- 1. 函数式接口的理解根据重构的思想,需要把容易变化的模块进行抽象并封装起来,从这个点来看,Java8新引入的函数式接口就是基于这个思想进行
- 本文实例为大家分享了Java实现简单猜拳游戏的具体代码,供大家参考,具体内容如下看网上的猜拳游戏那么多,但都是用switch输入数字,所以用
- 首先是创建redis-cluster文件夹:因为redis最少需要6个节点(三主三从),为了更好的理解,我这里创建了两台虚拟机(192.16
- 关于java图片验证码的文章最近更新了不少,帮助大家掌握java验证码的生成技术,下文为大家分享了java生成图片验证码最简单的方法,供大家
- java 数据类型:在Java中,数据类型分为两大种:基本数据类型(值类型)和包装类型(引用数据类型)。基本数据类型不是对象,不能调用toS
- 最近在做上传文件的服务,简单看了网上的教程。结合实践共享出代码。由于网上的大多数没有服务端的代码,这可不行呀,没服务端怎么调试呢。Ok,先上
- AbstractDetectingUrlHandlerMapping是通过扫描方式注册Handler,收到请求时由Abstrac
- 老生常谈的配置 但是还是需要说明一下EurekaApplication @EnableEurekaServer指定为server端
- 一、组件型注解:1、@Component 在类定义之前添加@Component注解,他会被spring容器识别,并转为bean。2、@Rep
- TreeMap 的实现就是红黑树数据结构,也就说是一棵自平衡的排序二叉树,这样就可以保证当需要快速检索指定节点。TreeSet 和 Tree
- 文件下载是一个软件开发中的常见需求。本文从最简单的下载方式开始步步递进,讲述了文件下载过程中的常见问题并给出了解决方案。并展示了如何使用多线
- 概述:Spring Boot 2.0相对于之前的版本,变化还是很大的。首先对jdk的版本要求已经不能低于1.8,其次依赖的spring的版本
- 简介Springboot Admin是一个管理和监控Springboot项目的组件,分为服务端和客户端,两端通过http进行通信。由于其轻量
- 1. 需要事先将jar包 放在kettle 的 libext 目录,kettle 在启动时会自动加载libext 目录下的所有 jar 包。
- Java2在1.4中新增了一个关键字:assert。在程序开发过程中使用它创建一个断言(assertion)。,它的语法形式有如下所示的两种
- 一、常量用final修饰(也称最终变量)常量在声明时必须赋初值,赋值后不能再修改值常量名通常用全大写字母表示声明时需要添加final或sta
- 编写Job定时执行任务十分有用,能解决很多问题,这次实习的项目里做了一下系统定时更新三方系统订单状态的功能,这里用到了Spring的定时任务
- 前言上一篇通过clusterservice对cluster做了一个简单的概述, 应该能够给大家一个初步认识。本篇将对cluster的代码组成
- java的构造函数是一个非常重要的作用,首先java里的构造函数是可以重载的,而且因为也是可以继承在父类的构造函数,所以在子类里,首先必然是
- CXF简介CXF是一个开源的WebService框架。Apache CXF = Celtix + XFire,开始叫 Apache Celt