1. 什么是数组?
数组(Array)是一种数据结构,用于存储多个相同类型的元素。这些元素在内存中是连续存储的,可以通过索引访问。数组的长度是固定的,在创建后不能改变。
2. 数组的声明、创建和初始化
数组的声明、创建和初始化是三个不同的步骤,可以在一个步骤中完成,也可以分别完成。
2.1 声明数组
声明数组时,只需指定数组的类型和名称。数组类型由元素类型加上 []
表示。
// 声明一个整型数组
int[] numbers;
// 声明一个字符串数组
String[] names;
2.2 创建数组
创建数组时,必须使用 new
关键字并指定数组的长度。
// 创建一个长度为 5 的整型数组
numbers = new int[5];
// 创建一个长度为 3 的字符串数组
names = new String[3];
2.3 初始化数组
初始化数组时,可以为每个元素指定初始值。如果使用动态初始化方式(如上例),未赋值的元素将自动初始化为其类型的默认值(如 int
默认值为 0
,String
默认值为 null
)。
- 静态初始化
// 创建并初始化数组
int[] numbers = {1, 2, 3, 4, 5};
// 创建并初始化字符串数组
String[] names = {"Alice", "Bob", "Charlie"};
- 动态初始化
int[] numbers = new int[5];
numbers[0] = 1;
numbers[1] = 2;
// 其他元素根据需要初始化
String[] names = new String[3];
names[0] = "Alice";
names[1] = "Bob";
// 其他元素根据需要初始化
3. 访问数组元素
数组元素通过索引访问,索引从 0
开始。
// 访问第一个元素
int firstNumber = numbers[0];
// 修改第三个元素的值
numbers[2] = 10;
注意:数组越界异常
访问无效索引会引发 ArrayIndexOutOfBoundsException
。例如,访问 numbers[5]
或负数索引都会导致异常,因为数组的有效索引范围是 0
到 length-1
。
4. 数组的长度
数组的长度是固定的,可以通过 length
属性获取。
// 获取数组的长度
int length = numbers.length;
5. 遍历数组
遍历数组是对每个元素进行操作的常见方式,有多种方式。
5.1 使用传统 for 循环
for (int i = 0; i < numbers.length; i++) {
System.out.println(numbers[i]);
}
5.2 使用增强的 for 循环(for-each)
for (int number : numbers) {
System.out.println(number);
}
public intfindDuplicate(intfindDuplicate) {
System.out.println(number);
}
5.3 使用 Arrays 类的 stream方法
import java.util.Arrays;
Arrays.stream(numbers).forEach(System.out::println);
6. 多维数组
多维数组可以看作数组的数组。常见的是二维数组,用于表示矩阵、表格等。
int[][] matrix = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
// 访问二维数组的元素
int element = matrix[1][2]; // 访问第二行第三列的元素,结果为 6
创建和初始化多维数组
// 创建一个 3x3 的整数矩阵
int[][] matrix = new int[3][3];
matrix[0][0] = 1;
matrix[0][1] = 2;
// 依此类推...
7. 数组的常用操作
Java 提供了许多方便的操作数组的方法,主要在 java.util.Arrays
类中。
7.1 数组排序
import java.util.Arrays;
int[] numbers = {5, 3, 1, 4, 2};
// 对数组进行升序排序
Arrays.sort(numbers);
System.out.println(Arrays.toString(numbers)); // 输出 [1, 2, 3, 4, 5]
7.2 数组复制
// 完全复制
int[] copy = Arrays.copyOf(numbers, numbers.length);
// 部分复制
int[] partialCopy = Arrays.copyOfRange(numbers, 1, 3);
7.3 数组填充
int[] filledArray = new int[5];
// 将所有元素填充为 7
Arrays.fill(filledArray, 7);
System.out.println(Arrays.toString(filledArray)); // 输出 [7, 7, 7, 7, 7]
7.4 数组比较
int[] array1 = {1, 2, 3};
int[] array2 = {1, 2, 3};
boolean areEqual = Arrays.equals(array1, array2); // 比较两个数组是否相等
8. 数组的优缺点
优点
- 访问速度快:数组元素可以通过索引快速访问。
- 内存连续:数组元素在内存中是连续存储的,访问效率高。
缺点
- 大小固定:数组创建后大小不可变,不能动态增加或减少元素。
- 类型固定:数组只能存储相同类型的元素,不支持不同类型的混合存储。
9. 常见问题及解决方法
9.1 数组越界异常
在访问数组元素时,如果使用了无效的索引会抛出 ArrayIndexOutOfBoundsException
。确保访问的索引在 0
到 length-1
范围内。
9.2 空指针异常
在使用对象类型数组时,如果数组中的元素尚未初始化null
,访问这些元素的属性或方法会导致 NullPointerException
。在使用前应确保数组元素已经被正确初始化。
10. 总结
数组是 Java 编程中的基本数据结构,适合存储和管理固定数量的同类型元素。掌握数组的基本操作和常见问题,是学习更高级数据结构和算法的基础。通过实际编程练习,可以更加熟悉和理解数组的使用方式和特性。