Java 中的锯齿数组

2025 年 5 月 9 日 | 阅读 9 分钟

Java 中的锯齿数组是数组的集合,其中每个数组可能包含不同数量的元素。相比之下,二维数组要求所有行和列具有相同的长度。

锯齿数组也称为“不规则数组”或“异形数组”。可以通过在声明中指定每个数组的大小来创建它们。例如,一个有三行的锯齿数组,第一行可以有三个元素,第二行有两个元素,第三行有四个元素。

锯齿数组示例

一个有三行的锯齿数组,第一行可以有三个元素,第二行有两个元素,第三行有四个元素。

锯齿数组的声明和初始化

在 Java 中,可以使用以下语法声明和初始化锯齿数组:

语法

在这里,datatype 是数组中元素的数据类型numRows 是锯齿数组中的行数numColumns1、numColumns2、...、numColumnsN 是每行的列数。用户应该知道,每行的列数是灵活的。

第一行创建一个包含 numRows 行的数组的数组。默认情况下,每一行都初始化为 null

后续行初始化锯齿数组的每一行。为锯齿数组的相应行创建一个包含 numColumns 个元素的新一维数组并将其分配给它。

初始化锯齿数组的方法

除了如上一个答案所示的标准声明和初始化锯齿数组的方法外,还有几种其他方法可以在 Java 中初始化锯齿数组。

1. 使用数组字面量

我们可以直接使用数组字面量来初始化锯齿数组元素,如下所示:

在这里,我们创建了一个有三行的锯齿数组,其中第一行有两个元素,第二行有三个元素,第三行有四个元素。

示例

编译并运行

输出

1 2 3
4 5
6 7 8 9

2. 使用嵌套循环

当元素需要以编程方式生成时,我们还可以使用嵌套循环来初始化锯齿数组元素。采用这种方法可能很有益。

在这里,我们设计了一个有三行的锯齿数组,第一行包含一个元素,第二行包含两个元素,第三行包含三个元素。使用简单的公式,嵌套循环生成锯齿数组中的元素。

示例

编译并运行

输出

1
2 3
4 5 6
7 8 9 10

3. 使用 Java 8 Stream API

使用 Java 8 Stream API,您可以使用 Arrays.stream 和 toArray 方法在一行中创建和初始化锯齿数组,如下所示:

在这里,我们创建了一个有三行的锯齿数组,第一行有两列,第二行有三列,第三行有四列。Arrays.stream 方法将每个一维数组转换为整数流,然后 toArray 方法将流收集到一个锯齿数组中。

示例

编译并运行

输出

1 2 3
4 5
6 7 8 9

4. 动态锯齿数组

在 Java 中,我们可以通过创建一个数组的数组来创建动态锯齿数组,其中每个子数组代表二维数组中的一行。然后,我们可以为每个子数组分配内存来指定其列数。

示例

编译并运行

输出

Enter the number of sub-arrays: 3
Enter the size of sub-array 1: 2
Enter the element at index 0 of sub-array 1: 1
Enter the element at index 1 of sub-array 1: 2
Enter the size of sub-array 2: 3
Enter the element at index 0 of sub-array 2: 3
Enter the element at index 1 of sub-array 2: 4
Enter the element at index 2 of sub-array 2: 5
Enter the size of sub-array 3: 1
Enter the element at index 0 of sub-array 3: 6
The jagged array is:
1 2
3 4 5
6

锯齿数组的优点

与具有固定大小的多维数组相比,锯齿数组有几个优点。

  1. 内存效率:锯齿数组比多维数组更节省内存,因为它们只为所需的元素分配内存。在具有固定大小的多维数组中,即使某些元素未使用,也会分配所有内存。
  2. 灵活性:锯齿数组比多维数组更灵活,因为每行的长度可以不同。锯齿数组能够表示非矩形或不规则的数据结构。
  3. 易于初始化:锯齿数组易于初始化,因为您可以单独指定每行的大小。锯齿数组适用于存储大小可变或动态生成的数据。
  4. 增强的性能:在某些情况下,锯齿数组可以提供增强的性能,例如当您需要独立地对每一行执行操作时,或者当您需要动态添加或删除行时。
  5. 更自然的数据表示:在某些情况下,锯齿数组可能比矩形数组更自然地表示数据。例如,在处理不规则形状的数据(如地理地图)时,锯齿数组可能是表示数据的更直观的方式。
  6. 更易于操作:锯齿数组比矩形数组更容易操作,因为它们允许直接访问单个元素。对于矩形数组,您可能需要使用更复杂的索引或切片操作来访问数据的子集。

锯齿数组与多维数组有何不同?

锯齿数组与多维数组不同。锯齿数组与多维数组之间存在一些差异,这些差异在下表中有所描述。

方面锯齿数组多维数组
结构每一行(或子数组)的长度可以不同。所有行必须具有相同的列数。
内存分配为每个子数组单独分配内存,当需要不同的行大小时,内存效率更高。它为所有元素分配连续的内存块,当行长度不同时可能浪费内存。
声明int[][] jaggedArray = {
    {1, 2, 3},
    {4, 5},
    {6, 7, 8, 9}
};
int[][] multiArray = new int[3][3]; // 固定大小:3 行,3 列
访问元素锯齿数组:jaggedArray[行][列]多维数组:multiArray[行][列]
使用场景当处理不规则数据结构(如表中的可变长度行)时很有用。它是网格、矩阵或固定大小表的理想选择。

锯齿数组选择题

1. Java 中的锯齿数组是什么?

  1. 每行具有相同列数的多维数组
  2. 一个整数一维数组
  3. 一个数组的数组,其中每个子数组的长度可以不同
  4. 预先为所有元素分配内存的数组

答案 3)

解释:锯齿数组是数组的数组,其中每行的列数可以不同。


2. 以下代码的输出是什么?

  1. 3
  2. 4
  3. 5
  4. 6

答案 3)

解释:jagged[1][1] 指的是第二行和第二个元素,即 5。


3. 以下哪项正确声明了 Java 中具有 3 行的锯齿数组?

  1. int jagged[][] = new int[][3];
  2. int jagged[][] = new int[3][];
  3. int jagged[][] = new int[3][3];
  4. int jagged[] = new int[3][];

答案 2)

解释:在 Java 中,要创建锯齿数组,我们首先定义行数。列的大小可以稍后单独指定。


4. 关于锯齿数组,哪个陈述是正确的?

  1. 所有行必须具有相同的列数
  2. 每个子数组的长度可以不同
  3. Java 不支持锯齿数组
  4. 锯齿数组必须是正方形的

答案 2)

解释:锯齿数组可以具有列长度不同的行,这使其适用于不均匀的数据。


5. 此代码的输出是什么?

  1. 2
  2. 3
  3. 5
  4. 编译错误

答案 2)

解释:jagged[1] 有 3 个元素,因此 jagged[1].length 为 3。


下一个主题Java 数组程序