数组是每种编程语言中都非常重要的数据结构,不同语言在数组的实现和处理上也各有差异。
在Java中,数组用于存储固定大小的同类型元素。
你可以声明一个数组变量,例如 numbers[100],来代替声明100个独立的变量 number0, number1, ..., number99。
本教程将介绍如何在Java中声明、创建和初始化数组,并提供相应的代码示例。
声明数组变量
在使用数组之前,首先需要声明数组变量。以下是声明数组变量的语法:
dataType[] arrayRefVar; // 推荐的方法或dataType arrayRefVar[]; // 效果相同,但不是推荐方法
注意:建议使用 dataType[] arrayRefVar 的声明风格来声明数组变量。dataType arrayRefVar[] 这种风格是从 C/C++ 语言中继承来的,Java 中采用这种风格是为了让 C/C++ 程序员能够更快地理解 Java 语言。
以下是这两种语法的代码示例:
double[] myList; // 推荐的方法或double myList[]; // 效果相同,但不是推荐方法
创建数组
在Java中,使用 new 操作符来创建数组,其语法如下:
arrayRefVar = new dataType[arraySize];
这条语句完成了两件事:
- 使用 dataType[arraySize] 创建了一个数组。
- 将新创建的数组的引用赋值给变量 arrayRefVar。
数组变量的声明和创建可以合并为一条语句,如下所示:
dataType[] arrayRefVar = new dataType[arraySize];
此外,还可以使用以下方式创建并初始化数组:
dataType[] arrayRefVar = {value0, value1, ..., valuek};
数组元素通过索引访问。数组索引从0开始,因此索引范围是从 0 到 arrayRefVar.length - 1。
当数组空间开辟后,可以通过索引访问数组元素,即 数组名称[索引]。需要注意的是,数组索引从0开始,所以索引范围是 0 到 数组长度-1。例如,一个长度为3的数组,可使用的索引是 0, 1, 2。如果访问超出索引范围,将抛出 java.lang.ArrayIndexOutOfBoundsException 异常。
动态初始化的数组中的每个元素都将被赋予该数据类型的默认值。数组是一个有序的数据集合,通常使用 for 循环来操作数组内容。在Java中,可以使用 数组名称.length 动态获取数组的长度。
示例:定义一个 int 型数组
public class ArrayDemo {public static void main(String[] args) {int data[] = new int[3]; // 开辟一个长度为3的数组data[0] = 10; // 第一个元素data[1] = 20; // 第二个元素data[2] = 30; // 第三个元素for (int x = 0; x < data.length; x++) {System.out.println(data[x]); // 通过循环控制索引}}
}
另一种分步创建数组的方式:
public class ArrayDemo {public static void main(String[] args) {int data[] = null;data = new int[3]; // 开辟一个长度为3的数组data[0] = 10; // 第一个元素data[1] = 20; // 第二个元素data[2] = 30; // 第三个元素for (int x = 0; x < data.length; x++) {System.out.println(data[x]); // 通过循环控制索引}}
}
需要注意的是,数组是引用类型,在使用前必须先开辟空间(实例化)。如果使用了未开辟空间的数组,将抛出 NullPointerException 异常。
public class ArrayDemo {public static void main(String[] args) {int data[] = null;System.out.println(data[0]); // 抛出 NullPointerException}
}
这一原则与之前讲解的对象是一致的。
在实际开发中,数组的使用非常普遍,但上述详细步骤较少出现。通常情况下,会直接使用数组并通过 for 循环进行输出。
处理数组
数组的元素类型和大小是固定的,因此在处理数组元素时,通常使用基本循环或 foreach 循环。
以下是一个完整的示例,展示了如何创建、初始化和操作数组:
public class TestArray {public static void main(String[] args) {double[] myList = {1.9, 2.9, 3.4, 3.5};// 打印所有数组元素for (int i = 0; i < myList.length; i++) {System.out.println(myList[i] + " ");}// 计算所有元素的总和double total = 0;for (int i = 0; i < myList.length; i++) {total += myList[i];}System.out.println("Total is " + total);// 查找最大元素double max = myList[0];for (int i = 1; i < myList.length; i++) {if (myList[i] > max) {max = myList[i];}}System.out.println("Max is " + max);}
}
以上实例编译运行结果如下:
1.9
2.9
3.4
3.5
Total is 11.7
Max is 3.5
在这个示例中,我们首先创建并初始化了一个 double 类型的数组 myList。然后,我们使用 for 循环来打印数组中的每个元素,计算所有元素的总和,并查找数组中的最大值。最后,我们将这些结果输出到控制台。
foreach 循环
JDK 1.5 引入了一种新的循环类型,称为 foreach 循环或增强型循环,它可以在不使用下标的情况下遍历数组。
语法格式如下:
for (type element : array) {System.out.println(element);
}
以下示例展示了如何使用 foreach 循环来打印数组 myList 中的所有元素:
public class TestArray {public static void main(String[] args) {double[] myList = {1.9, 2.9, 3.4, 3.5};// 打印所有数组元素for (double element : myList) {System.out.println(element);}}
}
以上实例编译运行结果如下:
1.9
2.9
3.4
3.5
在这个示例中,我们使用 foreach 循环遍历 myList 数组,并逐个打印出每个元素。这种方式使得代码更加简洁和易读。
数组作为函数的参数
数组可以作为参数传递给方法。例如,下面的例子展示了一个打印 int 数组中元素的方法。
public static void printArray(int[] array) {for (int i = 0; i < array.length; i++) {System.out.print(array[i] + " ");}
}
以下示例调用 printArray 方法来打印数组 {3, 1, 2, 6, 4, 2} 中的元素:
public class ArrayDemo {public static void main(String[] args) {printArray(new int[]{3, 1, 2, 6, 4, 2});}public static void printArray(int[] array) {for (int i = 0; i < array.length; i++) {System.out.print(array[i] + " ");}}
}
运行结果如下:
3 1 2 6 4 2
在这个示例中,我们定义了一个名为 printArray 的方法,该方法接受一个 int 类型的数组作为参数,并使用 for 循环遍历数组中的每个元素并打印出来。然后在 main 方法中调用 printArray 方法,并传入一个包含六个整数的数组。
数组作为函数的返回值
下面是一个示例,展示了如何将数组作为函数的返回值。这个方法 reverse 会反转输入的 int 数组,并返回一个新的反转后的数组。
public static int[] reverse(int[] list) {int[] result = new int[list.length];for (int i = 0, j = result.length - 1; i < list.length; i++, j--) {result[j] = list[i];}return result;
}
在上述示例中,result 数组作为函数的返回值。以下是一个完整的示例,展示如何调用 reverse 方法并打印结果:
public class ArrayDemo {public static void main(String[] args) {int[] originalArray = {1, 2, 3, 4, 5};int[] reversedArray = reverse(originalArray);System.out.print("Original array: ");printArray(originalArray);System.out.print("Reversed array: ");printArray(reversedArray);}public static int[] reverse(int[] list) {int[] result = new int[list.length];for (int i = 0, j = result.length - 1; i < list.length; i++, j--) {result[j] = list[i];}return result;}public static void printArray(int[] array) {for (int i = 0; i < array.length; i++) {System.out.print(array[i] + " ");}System.out.println();}
}
运行结果如下:
Original array: 1 2 3 4 5
Reversed array: 5 4 3 2 1
在这个示例中,我们定义了一个 reverse 方法,该方法接受一个 int 类型的数组作为参数,并创建一个新的数组 result 来存储反转后的元素。通过 for 循环将原数组中的元素从后向前复制到新数组中,最后返回新数组。main 方法中调用 reverse 方法并打印原始数组和反转后的数组。
Arrays 类
java.util.Arrays 类提供了许多方便操作数组的静态方法。这些方法包括给数组赋值、对数组排序、比较数组以及查找数组元素等。
功能和方法
- 给数组赋值:通过 fill 方法。
- 对数组排序:通过 sort 方法,按升序排列。
- 比较数组:通过 equals 方法比较数组中元素值是否相等。
- 查找数组元素:通过 binarySearch 方法对已排序的数组进行二分查找。
具体方法说明
序号 | 方法和说明 |
---|---|
1 | public static int binarySearch(Object[] a, Object key) <br> 使用二分查找算法在给定数组中搜索指定的对象(如 Byte , Int , double 等)。数组在调用前必须是已排序的。如果找到指定值,则返回其索引;否则返回 (-(插入点) - 1) 。 |
2 | public static boolean equals(long[] a, long[] a2) <br> 如果两个指定的 long 型数组彼此相等,则返回 true 。如果两个数组包含相同数量的元素,并且所有相应的元素都相等,则认为这两个数组是相等的。换句话说,如果两个数组以相同的顺序包含相同的元素,则它们是相等的。同样的方法适用于其他基本数据类型(如 Byte , short , int 等)。 |
3 | public static void fill(int[] a, int val) <br> 将指定的 int 值分配给指定 int 型数组中的每个元素。同样的方法适用于其他基本数据类型(如 Byte , short , int 等)。 |
4 | public static void sort(Object[] a) <br> 根据元素的自然顺序对指定对象数组进行升序排列。同样的方法适用于其他基本数据类型(如 Byte , short , int 等)。 |
以下是一些使用 Arrays 类的方法的示例代码:
import java.util.Arrays;public class ArraysDemo {public static void main(String[] args) {// 创建一个整数数组int[] numbers = {5, 2, 9, 1, 5, 6};// 打印原始数组System.out.println("Original array: " + Arrays.toString(numbers));// 给数组赋值Arrays.fill(numbers, 0);System.out.println("Array after fill: " + Arrays.toString(numbers));// 重新初始化数组numbers = new int[]{5, 2, 9, 1, 5, 6};// 对数组进行排序Arrays.sort(numbers);System.out.println("Sorted array: " + Arrays.toString(numbers));// 比较两个数组int[] numbers2 = {5, 2, 9, 1, 5, 6};boolean isEqual = Arrays.equals(numbers, numbers2);System.out.println("Are the arrays equal? " + isEqual);// 查找数组元素int index = Arrays.binarySearch(numbers, 9);if (index >= 0) {System.out.println("Element 9 found at index: " + index);} else {System.out.println("Element 9 not found");}}
}
在这个示例中,我们展示了如何使用 Arrays 类的 fill、sort、equals 和 binarySearch 方法来操作数组。这些方法使得数组的操作变得更加简洁和高效。