CodeGym /Java 博客 /China /Java 中的数组
作者
Oleksandr Miadelets
Head of Developers Team at CodeGym

Java 中的数组

已在 China 群组中发布
想象一下储藏室里的柜子。每个柜子都有自己的编号,都存储某个包裹对象。或者一份酒单,每种酒都有编号,你可以通过所喝的酒的编号来排序。或者学生名单,其中“亚当斯”记录在第一个位置,“齐默”记录在最后一个位置。或者飞机上的乘客名单,每个人都被分配了一个有编号的座位。在 Java 中,数组通常用于处理这种结构,即同类数据集。

CodeGym 课程中的数组

在 CodeGym 上,你开始在 Java 语法目标的第 7 级上使用数组。三节课专门讲述此内容,而且各级都有 8 个任务来巩固你使用数组的技能。但在此课程期间,你会多次遇到数组(特别是 Array 类将在 Java 连接目标中进行学习,而且未来也要使用)。

什么是数组?

数组是存储同类型元素的数据结构。你可以将其看做一组有编号的单元,将数据放在每个单元中(每个单元一个数据元素)。使用特定单元格的编号来访问该单元格。数组中元素的编号也称为下标。 在 Java 中,数组是同质的,即数组的所有单元都包含同类型的元素。因此,整数数组仅包含整数 (int),字符串数组仅包含字符串,Dog 类的实例数组仅包含 Dog 对象。也就是说,Java 不允许在数组的第一个单元中放一个整数,第二个单元中放一个 String,第三个单元中放一个 Dog。 Java 中的数组 - 1

声明数组

如何声明数组?

与任何变量一样,在 Java 中必须声明数组。可以采用两种方法实现。这两种方法是等同的,但第一个方法与 Java 的风格更一致。第二种方法是 C 语言的遗产:许多 C 程序员改为使用 Java,为了方便起见,保留了这种备用方法。下表说明了两种在 Java 中声明数组的方法:
编号 声明数组,Java 语法 示例 备注
1.

dataType[] arrayName;

int[] myArray;

Object[]
arrayOfObjects;
建议采用这种方式声明数组。这是 Java 风格。
2.

dataType arrayName[];

int myArray[];

Object
arrayOfObjects[];
数组声明方法继承自 C/C++,在 Java 中使用
在这两种情况下,dataType 是数组中变量的类型。在这些示例中,我们声明了两个数组。一个数组存储 int,另一个数组存储 Object 对象。因此,数组声明包含名称和类型(数组元素的类型)。ArrayName 是数组的名称。

创建数组

如何创建数组?

与任何其他对象一样,你可以使用 new 运算符创建 Java 数组,即在内存中为其保留一个位置。具体做法如下:

new typeOfArray[length];
其中,typeOfArray 是数组的类型,length 是其长度(即单元的数量),以整数 (int) 表示。但请注意,这里我们仅为数组分配内存 — 我们没有将声明的数组与任何先前声明的变量相关联。通常,数组首先进行声明,然后进行实例化,例如:

int[] myArray; // 数组声明
myArray = new int[10]; // 创建含 10 个整数的数组(为其分配内存)
这里我们创建了一个名为 myArray 的整数数组,告诉编译器该数组包含 10 个单元(每个单元包含一个整数)。不过,使用下面的缩写语法在声明数组时立即创建数组的做法更为常见:

int[] myArray = new int [10]; // 一次声明数组并分配内存
请注意:使用 new 运算符创建数组后,其单元便包含默认值。对于数值类型(如我们的例子所示),默认值为 0;对于 boolean 类型,默认值为 false,对于引用类型,默认值为 null。 因此,在执行此语句后

int[] myArray = new int[10];
我们得到一个由十个整数组成的数组,在程序改变这些值之前,每个单元格都包含 0。

Java 中的数组长度

如上所述,数组的长度是数组设计容纳的元素的数量。数组的长度在创建之后便无法更改。 请注意,在 Java 中,数组元素是从零开始编号的。因此,如果有包含 10 个元素的数组,则第一个元素的下标是 0,最后一个元素的下标是 9。 Java 中的数组 - 2你可以使用 length 变量获得数组长度。例如:

int[] myArray = new int[10]; // 创建包含 10 个元素的 int 数组并将其命名为 myArray
System.out.println(myArray.length); // 显示数组长度,即我们可以放在数组中的元素的数量  
输出:
10
Java 中的数组 - 3

初始化数组和访问其元素

现在我们知道了如何在 Java 中创建数组:此过程得到的不是空数组,而是填充了默认值的数组。例如,对于 int 数组,默认值是 0,如果是任何引用类型的数组,则每个单元中的默认值为 null。 我们通过数组的下标来访问数组元素(例如,设置其值,在屏幕上显示,或对其执行某种操作)。 数组初始化是使用特定值(不是默认值)填充数组的过程。 示例:让我们为四个季节创建一个字符串数组,并用季节的名称填充它。

String[] seasons = new String[4]; /* 声明并创建数组。Java 为一个由 4 个字符串组成的数组分配内存,每个单元格都设置为 null(因为 String 是引用类型)*/

seasons[0] = "冬季"; /* 我们将第一个单元,即下标为零的单元,设置为“冬季”。这里我们访问数组的第 0 个元素,并向其中写入一个特定的值。 */
seasons[1] = "春季"; // 我们对下标为 1(第二个单元)的单元执行类似的过程
seasons[2] = "夏季"; // ... 下标为 2
seasons[3] = "秋季"; // 最后,下标为 3
现在将季节的名称写入数组的四个单元。我们可以使用不同的方式初始化数组,将声明和初始化结合起来:

String[] seasons = new String[] {"冬季", "春季", "夏季", "秋季"};
此外,new 运算符可以省略:

String[] seasons = {"冬季", "春季", "夏季", "秋季"};

在 Java 中如何在屏幕上显示数组:

你可以使用 for 循环在屏幕(即控制台)上显示数组元素。另一种更短的显示数组的方法将在名为“使用数组的有用方法”一段中讨论。同时,了解下这个使用循环显示数组的示例:

String[] seasons = new String {"冬季", "春季", "夏季", "秋季"};
for (int i = 0; i < 4; i++) {
System.out.println(seasons[i]);
}
程序显示以下内容:
冬季 春季 夏季 秋季

Java 中的一维和多维数组

如果我们想创建的不是数字、字符串或其他对象的数组,而是数组的数组呢?Java 可以帮到你。 我们已经熟悉的这种数组 (int[] myArray = new int[8]) 称为一维数组。但数组的数组称为二维数组。就像一个表,具有行号和列号。或者,如果你学过线性代数基础知识,可以将其视作矩阵。 Java 中的数组 - 4为何需要此类数组?那是要对矩阵和表格,以及其他具有类似结构的对象编程。例如,棋盘可以用一个 8×8 的数组来表示。 按如下所示声明和创建多维数组:

Int[][] myTwoDimentionalArray = new int[8][8];
此数组包含 64 个元素:myTwoDimentionalArray[0][0]myTwoDimentionalArray[0][1]myTwoDimentionalArray[1][0]myTwoDimentionalArray[1][1] 等直到 myTwoDimentionalArray[8][8]。 如果我们使用它来代表棋盘,则 A1 对应于 myTwoDimentionalArray[0][0],E2 对应于 myTwoDimentionalArray[4][1]。 但是我们能推进到什么程度?在 Java 中,可以指定数组的数组...数组的数组的数组,等等。当然,三维和更高维的数组很少使用。也就是说,你可以用一个三维数组来对比如魔方进行编程。

使用数组的有用方法

Java 提供 java.util.Arrays 类来使用数组。一般来说,对数组执行的最常见的操作是初始化(用元素填充)、检索元素(通过下标)、排序和搜索。其他时间我们再讨论搜索和排序数组主题。一方面,自己编写几个搜索和排序算法是一种很好的做法。另一方面,所有最佳算法都已经实现并包含在标准 Java 库中,你可以合法使用。 下面是此类中三种有用的方法。

排序数组

void sort(int[] myArray, int fromIndex, int toIndex) 方法按升序对整数数组或子数组进行排序。

在数组中搜索元素

int binarySearch(int[] myArray, int fromIndex, int toIndex, int key).此方法会在已排序的 myArray 数组或子数组中查找从 fromIndextoIndexkey 元素。如果找到此项,则返回此项的下标。否则,它返回 (-fromIndex)-1

将数组转换为字符串

String toString(int[] myArray) 方法会将数组转换为字符串。在 Java 中,数组不会重写 toString()。这表示,如果你尝试一次显示整个数组 (System.out.println(myArray)) 而不是一次显示一个元素(如标题为“在屏幕上显示数组”一段所述),你将得到类的名称和数组的十六进制散列(由 Object.toString() 定义)。 如果你是位初学者,可能不太理解关于 toString 方法的解释。你不需要在开始便了解该方法,但使用该方法可轻松显示数组。使用 Java 不使用循环就可轻松显示数组。下面的示例演示了这种情况。

使用 sort、binarySearch 和 toString 的示例

我们创建一个整数数组,使用 toString 进行显示,使用 sort 方法排序,然后查找其中的某个数字。

class Main {
    public static void main(String[] args) {
        int[] array = {1, 5, 4, 3, 7}; // 声明和初始化数组
        System.out.println(array); // 尝试在不使用 toString 方法的情况下显示数组 — 结果是一个十六进制数
        System.out.println(Arrays.toString(array)); // 正确显示该数组
        Arrays.sort(array, 0, 4); // 从第 0 到第 4 个元素对整个数组进行排序
        System.out.println(Arrays.toString(array)); // 显示已排序的数组
        int key = Arrays.binarySearch(array, 5); // 在已排序的数组中查找数字 5。
        // binarySearch 方法将返回我们正在搜索的数组元素的下标
        System.out.println(key); // 显示我们已搜索出的数字的下标
System.out.println(Arrays.binarySearch(array, 0)); // 现在尝试查找不在数组中的数字,
        // 并立即显示结果

    }
}
输出:

[I@1540e19d
[1, 5, 4, 3, 7]
[1, 3, 4, 5, 7]
3
-1
第一个字符串试图在不使用 toString 的情况下显示数组。第二个字符串是使用 toString 显示的数组。第三个字符串是已排序的数组。第四个字符串是我们在已排序数组中搜索的数字 (5) 的下标(记住我们从零开始计数,所以数组第四个元素的下标是 3)。在第五个字符串中,我看到 -1。这是一个无效的数组下标。它表示我们搜索的数字(在此案例中为 0)不在数组中。

nutshell 中的数组

  • 数组的基本特征:放入其中的数据的类型、名称和长度。
    最后一个属性是在创建数组时(为数组分配内存时)确定的。前两个属性是在声明数组时确定的。

  • 数组大小(单元数)必须为 int

  • 在创建数组后更改数组的长度是不可能的。

  • 数组元素可以通过其下标进行访问。

  • 数组中的元素和 Java 中的其他元素一样,都是从零开始编号的。

  • 创建数组后,它会填充默认值。

  • Java 中的数组与 C++ 中的数组并不相同。后者几乎相当于指向动态数组的指针。

关于数组的有用资料

想了解有关数组的更多信息吗?请阅读下面的文章。这些文章包含很多有关这个主题的有趣和有用的材料。
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION