1. 引言
数组是 Java 中的强大工具,但基础语法很快就会陷入重复性工作。此时可以使用 java.util.Arrays —— 一个用于数组操作的静态方法集合:排序、复制、比较、格式化输出等。无需创建实例——所有方法都是静态的,通过类名调用。
要使用这些方法,请在文件开头添加 import:
import java.util.Arrays;
如果忘记导入,编译器会提示 Arrays “未找到”——这不是 bug,而是在未导入时的预期行为。
2. 数组排序:Arrays.sort
Arrays.sort 如何工作
语法
Arrays.sort(array);
Arrays.sort(array, startIndex, endIndex);
该方法就地排序——会改变原数组而不会返回新数组。想保留原始顺序?请先复制数组。
示例:对整型数组排序
int[] scores = {5, 2, 9, 1, 7};
Arrays.sort(scores); // 按升序排序
System.out.println("已排序的数组:" + Arrays.toString(scores));
// 输出:[1, 2, 5, 7, 9]
示例:对字符串数组排序
String[] names = {"Vasya", "Petya", "Anya", "Igor"};
Arrays.sort(names);
System.out.println(Arrays.toString(names));
// [Anya, Igor, Petya, Vasya]
重要:字符串按字典序(按字母顺序)排序,数字按升序排序。
排序数组的一部分
int[] arr = {7, 5, 3, 1, 9, 8};
Arrays.sort(arr, 1, 4); // 对索引 1 到 3(不含 4)的元素排序
System.out.println(Arrays.toString(arr));
// [7, 1, 3, 5, 9, 8]
特性
- 就地排序:原数组会被修改。
- 数字按升序,字符串按字母顺序。
- 对于复杂对象,请使用带 Comparator 的重载。
3. 填充数组:Arrays.fill
语法
Arrays.fill(array, value);
Arrays.fill(array, startIndex, endIndex, value);
该方法将所有元素或指定范围的元素填充为同一值。
int[] marks = new int[5];
Arrays.fill(marks, 3); // 所有元素现在都为 3
System.out.println(Arrays.toString(marks)); // [3, 3, 3, 3, 3]
填充数组的一部分
int[] arr = new int[10];
Arrays.fill(arr, 2, 5, 7); // 将索引 2 到 4(不含 5)的元素填充为 7
System.out.println(Arrays.toString(arr));
// [0, 0, 7, 7, 7, 0, 0, 0, 0, 0]
填充字符串数组
String[] guests = new String[4];
Arrays.fill(guests, "空");
System.out.println(Arrays.toString(guests)); // [空, 空, 空, 空]
4. 复制数组:Arrays.copyOf 和 Arrays.copyOfRange
Arrays.copyOf
语法
Arrays.copyOf(sourceArray, newLength);
创建一个新数组并从原数组复制元素。如果新长度大于原长度,尾部将用默认值填充(0 对于 int,引用类型为 null)。
int[] original = {1, 2, 3};
int[] copy = Arrays.copyOf(original, 5);
System.out.println(Arrays.toString(copy)); // [1, 2, 3, 0, 0]
缩短数组
int[] shortCopy = Arrays.copyOf(original, 2);
System.out.println(Arrays.toString(shortCopy)); // [1, 2]
Arrays.copyOfRange
语法
Arrays.copyOfRange(sourceArray, startIndex, endIndex);
int[] arr = {10, 20, 30, 40, 50};
int[] mid = Arrays.copyOfRange(arr, 1, 4); // 复制索引 1 到 3 的元素
System.out.println(Arrays.toString(mid)); // [20, 30, 40]
5. 比较数组:Arrays.equals 和 Arrays.deepEquals
在 Java 中不能通过 == 比较数组——它比较的是引用而不是内容:
int[] a = {1, 2, 3};
int[] b = {1, 2, 3};
System.out.println(a == b); // false!
如何比较内容?
Arrays.equals(array1, array2);
Arrays.deepEquals(matrix1, matrix2);
System.out.println(Arrays.equals(a, b)); // true
一维数组使用 Arrays.equals,二维及以上使用 Arrays.deepEquals。
示例:比较二维数组
int[][] matrix1 = {{1, 2}, {3, 4}};
int[][] matrix2 = {{1, 2}, {3, 4}};
System.out.println(Arrays.equals(matrix1, matrix2)); // false!
System.out.println(Arrays.deepEquals(matrix1, matrix2)); // true
6. 优雅打印数组:Arrays.toString 与 Arrays.deepToString
直接打印数组会得到不可读的字符串:
int[] arr = {1, 2, 3};
System.out.println(arr); // [I@7a81197d
语法
Arrays.toString(array);
Arrays.deepToString(matrix);
System.out.println(Arrays.toString(arr)); // [1, 2, 3]
int[][] matrix = {{1, 2}, {3, 4}};
System.out.println(Arrays.deepToString(matrix)); // [[1, 2], [3, 4]]
7. 使用 Arrays 类的常见错误
错误 1:尝试用 == 比较数组
数组是对象,== 只比较引用。即使值相同,结果也会是 false。请使用 Arrays.equals(一维)或 Arrays.deepEquals(多维)。
错误 2:忽略排序会“就地”修改数组
如果需要保留原始顺序,请先用 Arrays.copyOf 做副本,再对副本排序。否则原数组的顺序会丢失。
错误 3:误解 Arrays.fill 和 Arrays.copyOfRange 的边界
这些方法使用半开区间:右边界不包含。例如,Arrays.fill(arr, 2, 5, 9) 会填充索引为 2、3、4 的元素,而不会影响索引为 5 的元素。
错误 4:直接打印数组
调用 System.out.println(arr) 会打印技术性表示。请对一维数组使用 Arrays.toString,对多维数组使用 Arrays.deepToString。
错误 5:用 Arrays.equals 比较多维数组
该方法只比较最上层(内部数组的引用)。要比较内容,请使用 Arrays.deepEquals。
GO TO FULL VERSION