数组的定义与基本概念
在Java中,数组是一种用于存储固定大小同类型元素的数据结构,它是一组连续的内存空间,所有元素共享同一个变量名,通过索引(下标)来访问和操作,数组的索引从0开始,最大索引为数组长度减1,一个长度为5的数组,其有效索引范围为0到4,数组的特点包括长度固定、类型统一、内存连续,这些特性使得数组在存储和访问数据时具有高效性,但同时也限制了其灵活性——一旦创建,长度不可改变。
数组的声明与初始化
声明数组
声明数组时需要指定数组元素的类型和数组名称,语法为“类型[] 数组名;”或“类型 数组名[];”,第一种语法更为推荐,因为它更清晰地表明数组是一种类型。
int[] numbers; // 声明一个整型数组 String[] names; // 声明一个字符串数组 double[] scores; // 声明一个双精度浮点型数组
初始化数组
数组的初始化分为静态初始化和动态初始化两种方式。
-
静态初始化:在声明数组的同时直接为其赋值,系统会根据初始值自动计算数组长度,语法为“类型[] 数组名 = {值1, 值2, …};”。
int[] primes = {2, 3, 5, 7, 11}; // 长度为5的整型数组 String[] fruits = {"Apple", "Banana", "Orange"}; // 长度为3的字符串数组 -
动态初始化:先声明数组,再通过
new关键字分配内存空间并指定长度,之后可以为每个元素赋值,语法为“类型[] 数组名 = new 类型[长度];”。int[] ages = new int[5]; // 声明长度为5的整型数组,默认值为0 ages[0] = 18; // 为第一个元素赋值 ages[1] = 20; // 为第二个元素赋值
多维数组的使用
Java支持多维数组,即数组的数组,最常见的是二维数组,可以理解为表格结构,有行和列,二维数组的声明和初始化方式如下:
声明与初始化二维数组
int[][] matrix = new int[3][4]; // 3行4列的整型二维数组
String[][] table = {{"Name", "Age"}, {"Alice", "25"}, {"Bob", "30"}}; // 静态初始化
访问二维数组元素
通过行索引和列索引访问元素,
int value = matrix[1][2]; // 获取第二行第三列的元素 table[0][1] = "Age"; // 修改第一行第二列的值
遍历二维数组
通常使用嵌套循环遍历二维数组:
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();
}
数组的常用操作
获取数组长度
使用length属性获取数组的长度,
int len = numbers.length; // 获取数组numbers的长度
访问与修改元素
通过索引访问或修改元素,
int first = numbers[0]; // 获取第一个元素 numbers[2] = 100; // 修改第三个元素的值为100
遍历数组
使用增强型for循环(for-each循环)遍历数组,语法简洁:
for (int num : numbers) {
System.out.println(num);
}
数组的复制
Java中数组的复制可以通过System.arraycopy()方法或Arrays.copyOf()方法实现。
int[] source = {1, 2, 3, 4, 5};
int[] destination = new int[source.length];
System.arraycopy(source, 0, destination, 0, source.length); // 方法一
int[] copy = Arrays.copyOf(source, source.length); // 方法二
数组的工具类:java.util.Arrays
Java提供了Arrays工具类,包含多种操作数组的方法,如排序、搜索、填充等,常用方法包括:
-
sort():对数组进行升序排序。Arrays.sort(numbers);
-
binarySearch():在已排序的数组中查找元素,返回索引。int index = Arrays.binarySearch(numbers, 3);
-
fill():用指定值填充数组。Arrays.fill(numbers, 0); // 将所有元素设为0
-
toString():将数组转换为字符串形式,便于输出。System.out.println(Arrays.toString(numbers));
数组的异常处理
在操作数组时,常见的异常包括:
-
ArrayIndexOutOfBoundsException:当访问的索引超出数组范围时抛出。
int[] arr = new int[3]; int value = arr[5]; // 索引5超出范围(0-2),抛出异常
-
NullPointerException:当数组未初始化(即值为
null)时尝试访问或操作数组抛出。int[] arr = null; int len = arr.length; // arr为null,抛出异常
为避免异常,应确保数组已正确初始化,并在访问索引前检查其有效性:
if (arr != null && index >= 0 && index < arr.length) {
int value = arr[index];
}
数组的优缺点与应用场景
优点:
- 访问速度快:由于内存连续,通过索引访问元素的时间复杂度为O(1)。
- 内存占用小:相比集合类(如
ArrayList),数组没有额外的对象开销。 - 使用简单:语法直观,适合存储固定大小的数据。
缺点:
- 长度固定:一旦创建,长度不可改变,需要动态扩容时需创建新数组并复制数据。
- 类型安全:只能存储同类型元素,无法直接存储混合类型数据。
- 功能有限:不提供内置的插入、删除、查找等方法,需手动实现。
应用场景:
- 存储固定数量的数据,如月份数组、星期数组等。
- 作为函数参数传递批量数据,如排序算法中的数组参数。
- 多维数组用于表示矩阵、表格等结构化数据。
在Java中建立数组是编程的基础技能,掌握数组的声明、初始化、访问和操作方法对于开发至关重要,通过合理使用数组和Arrays工具类,可以高效地处理批量数据,同时需注意避免常见的异常问题,尽管数组在灵活性上不及集合类,但在性能和内存效率方面具有优势,适用于多种实际开发场景。








