likes
comments
collection
share

Java零基础之数组篇(4):深入理解Java中的多维数组!在上一期的内容中,我们讨论了Java中Arrays类的常用方

作者站长头像
站长
· 阅读数 20

  在上一期的内容中,我们讨论了Java中Arrays类的常用方法,学习了如何使用这些方法对数组进行排序、查找、复制和比较。掌握了这些基本操作之后,我们可以更轻松地处理一维数组中的数据。但是在许多应用场景中,单维数组已经无法满足我们的需求,例如在处理矩阵、图像、表格等复杂数据结构时,往往需要使用多维数组

  本期我们将深入探讨多维数组,尤其是二维数组的定义、初始化、遍历和不规则数组的创建与应用。

多维数组的定义和初始化

多维数组的定义

  在Java中,多维数组实际上是数组的数组。二维数组是最常见的多维数组形式,它可以看作一个矩阵或表格,其中每个元素本质上也是一个一维数组。多维数组不仅仅限于二维,理论上我们可以创建任意维度的数组,但维度越高,操作和理解难度也会相应增加。

二维数组的示例

int[][] matrix = new int[3][4];  // 创建一个3行4列的二维数组

  在这个例子中,matrix是一个二维数组,它包含3个一维数组,每个一维数组又包含4个元素。

声明和动态初始化二维数组

  动态初始化指的是在声明数组时,指定数组的大小,但不为其赋值。可以理解为在内存中为数组分配空间,但不立即为其中的每个元素赋具体的值。

动态初始化二维数组的语法

int[][] matrix = new int[3][4];  // 创建一个3行4列的二维数组

  这行代码的含义是,创建了一个包含3个一维数组的二维数组,每个一维数组都包含4个整数。Java会自动将每个元素初始化为其默认值(对于int类型,默认值是0)。

  我们也可以在声明时仅指定二维数组的行数,而后动态地为每行指定列数:

int[][] matrix = new int[3][];  // 创建一个包含3行的二维数组
matrix[0] = new int[4];  // 第一行包含4列
matrix[1] = new int[2];  // 第二行包含2列
matrix[2] = new int[3];  // 第三行包含3列

  这是一个不规则数组的初始化示例(稍后会详细讨论不规则数组的概念)。

静态初始化二维数组

  与动态初始化不同,静态初始化是在声明数组时,直接为数组赋值。我们可以在初始化时明确指定数组的每个元素的值:

int[][] matrix = {
    {1, 2, 3, 4},
    {5, 6, 7, 8},
    {9, 10, 11, 12}
};

  在这段代码中,创建了一个包含3行4列的二维数组,并为每个元素赋了具体的值。静态初始化的优点是直观、简洁,适用于在数组创建时就已知具体数据的情况。

多维数组的遍历与访问

使用嵌套for循环遍历二维数组

  遍历二维数组的常见方式是使用嵌套for循环。外层循环控制行数,内层循环控制列数。让我们以一个3行4列的二维数组为例:

int[][] matrix = {
    {1, 2, 3, 4},
    {5, 6, 7, 8},
    {9, 10, 11, 12}
};

for (int i = 0; i < matrix.length; i++) {  // 遍历行
    for (int j = 0; j < matrix[i].length; j++) {  // 遍历列
        System.out.print(matrix[i][j] + " ");
    }
    System.out.println();
}

输出结果:

1 2 3 4 
5 6 7 8 
9 10 11 12

解释:

  • matrix.length表示二维数组的行数。在这个例子中,matrix.length的值为3
  • matrix[i].length表示每一行的列数。在这个例子中,每行的列数都是4

  通过嵌套的for循环,我们可以逐行逐列地访问二维数组的每一个元素。

不规则数组(稀疏数组)

  在二维数组中,不规则数组指的是每一行的列数不相同的数组。Java允许创建这样的不规则数组,即每一行可以包含不同数量的列。例如:

int[][] irregularMatrix = new int[3][];
irregularMatrix[0] = new int[4];  // 第一行有4列
irregularMatrix[1] = new int[2];  // 第二行有2列
irregularMatrix[2] = new int[3];  // 第三行有3列

  不规则数组在某些特殊场景下非常有用,比如当你需要存储不同长度的数据集合时,它比矩阵形式的数组更节省内存。

  遍历不规则数组的方式与普通二维数组相同,使用嵌套的for循环,但在访问每一行的列数时需要动态判断:

for (int i = 0; i < irregularMatrix.length; i++) {
    for (int j = 0; j < irregularMatrix[i].length; j++) {
        System.out.print(irregularMatrix[i][j] + " ");
    }
    System.out.println();
}

  不规则数组常用于稀疏矩阵(大部分元素为0)或不对称的数据结构中,它们为存储稀疏数据提供了更高的空间利用率。

本地实际运行结果:

Java零基础之数组篇(4):深入理解Java中的多维数组!在上一期的内容中,我们讨论了Java中Arrays类的常用方

代码解析:

  针对如上示例代码,这里我给大家详细的代码剖析下,以便于帮助大家理解的更为透彻,帮助大家早日掌握。

  这个Java代码片段是用来遍历并打印一个不规则矩阵(即“稀疏矩阵”或“非矩形数组”)的每个元素。不规则矩阵在Java中通常是一个“二维数组”,但每一行(即每个子数组)的长度可以不同。

  1. for (int i = 0; i < irregularMatrix.length; i++) {

    • 这是一个外层循环,用来遍历二维数组的每一行。irregularMatrix.length返回这个数组的总行数。
    • 变量i是循环变量,表示当前行的索引。
  2. for (int j = 0; j < irregularMatrix[i].length; j++) {

    • 这是内层循环,用来遍历每一行的元素。irregularMatrix[i].length表示当前行i的列数(即当前行中的元素个数)。
    • 变量j是循环变量,表示当前行中具体的列索引。
  3. System.out.print(irregularMatrix[i][j] + " ");

    • 通过irregularMatrix[i][j]获取当前元素,并使用System.out.print输出到控制台。后面的+ " "是在每个元素之后添加一个空格,以确保在同一行打印时,元素之间有间隔。
  4. System.out.println();

    • 当内层循环结束(即某一行的所有元素都打印完毕)时,执行System.out.println();,打印一个换行符。这确保下一行的元素会从新的一行开始打印。

代码行为:

  • 该代码使用两层嵌套循环,依次访问和打印二维不规则数组中的所有元素。
  • 外层循环负责遍历每一行,内层循环负责遍历每一行的所有列。
  • 每一行的元素被打印在同一行中,并在所有元素打印完毕后换行。

举例:

如果irregularMatrix是:

int[][] irregularMatrix = {
    {1, 2, 3},
    {4, 5},
    {6, 7, 8, 9}
};

运行此代码将打印:

1 2 3 
4 5 
6 7 8 9 

关键点:

  1. 不规则矩阵:Java允许二维数组中每行的长度不同,称为不规则矩阵,这与普通的矩形矩阵不同。
  2. 二维数组的遍历:这种方式适用于遍历不规则矩阵,确保每行按其实际长度进行遍历。

总结

  在本期中,我们详细讨论了Java中的多维数组,特别是二维数组的定义、初始化和遍历方法。多维数组为我们处理复杂数据提供了极大的灵活性。总结本期重点:

  • 动态初始化:可以为二维数组指定行数和列数,并在运行时动态分配内存。
  • 静态初始化:在声明数组时直接为其赋值,适用于已知初始数据的情况。
  • 嵌套for循环遍历:是遍历二维数组最常用的方式。
  • 不规则数组:允许创建行与列数不同的数组,适用于稀疏数据或不对称结构。

  多维数组广泛用于矩阵运算、图像处理、棋盘游戏等场景,它们能够简洁而高效地表示复杂的数据结构。

下期预告

  在下一期内容中,我们将进一步探讨数组的高级操作,包括数组作为方法参数和返回值、数组的深拷贝与浅拷贝,以及数组的动态扩展。这些操作将帮助你在开发中更灵活地使用数组,处理更复杂的数据结构和场景。敬请期待!

最后

  大家如果觉得看了本文有帮助的话,麻烦给不熬夜崽崽点个三连(点赞、收藏、关注)支持一下哈,大家的支持就是我写作的无限动力。

转载自:https://juejin.cn/post/7413562537689317410
评论
请登录