Java中的Arrays工具类详解
Arrays是Java中处理数组的核心工具类,位于java.util
包中,提供了丰富的静态方法来操作数组(排序、搜索、比较、填充、复制等)。下面我将全面解析Arrays类的功能和使用方法。
一、核心功能概览
1. 排序与搜索
// 基本类型数组排序
int[] nums = {3,1,4,2};
Arrays.sort(nums); // [1,2,3,4]
// 对象数组排序(需实现Comparable)
String[] words = {"banana", "apple"};
Arrays.sort(words); // ["apple", "banana"]
// 并行排序(大数据量性能更好)
int[] largeArray = new int[1000000];
Arrays.parallelSort(largeArray);
// 二分查找(数组必须已排序)
int index = Arrays.binarySearch(nums, 3); // 返回2
2. 数组比较与哈希
int[] a1 = {1,2,3};
int[] a2 = {1,2,3};
// 深度比较
boolean equal = Arrays.equals(a1, a2); // true
// 多维数组比较
int[][] matrix1 = {{1,2}, {3,4}};
int[][] matrix2 = {{1,2}, {3,4}};
boolean deepEqual = Arrays.deepEquals(matrix1, matrix2); // true
// 哈希码计算
int hashCode = Arrays.hashCode(a1);
int deepHashCode = Arrays.deepHashCode(matrix1);
3. 数组填充与复制
// 填充数组
int[] arr = new int[5];
Arrays.fill(arr, 1); // [1,1,1,1,1]
// 范围填充
Arrays.fill(arr, 1, 3, 9); // [1,9,9,1,1]
// 数组复制
int[] copy = Arrays.copyOf(arr, 3); // [1,9,9]
int[] rangeCopy = Arrays.copyOfRange(arr, 1, 4); // [9,9,1]
4. 数组转列表
String[] fruits = {"apple", "banana"};
List<String> list = Arrays.asList(fruits);
// 注意:返回的是固定大小的列表,不能add/remove
list.set(0, "orange"); // 允许修改
// list.add("pear"); // 抛出UnsupportedOperationException
5. 流处理(Java8+)
int[] numbers = {1,2,3};
IntStream stream = Arrays.stream(numbers);
long sum = Arrays.stream(numbers).sum();
二、深度功能解析
1. 自定义排序
// 自定义Comparator排序
String[] words = {"apple", "Banana", "cherry"};
Arrays.sort(words, String.CASE_INSENSITIVE_ORDER);
// 按字符串长度排序
Arrays.sort(words, (s1, s2) -> s1.length() - s2.length());
// 对象数组排序
Person[] people = {...};
Arrays.sort(people, Comparator.comparing(Person::getAge));
2. 并行排序原理
parallelSort()
使用Fork/Join框架:
- 数组长度<2^13:使用快速排序
- 数组长度≥2^13:将数组分割成多个子数组并行排序,然后合并
3. 二分查找变体
// 查找第一个大于等于key的元素
int[] nums = {1,3,5,7};
int index = Arrays.binarySearch(nums, 4);
if (index < 0) {
int insertionPoint = -index - 1;
// insertionPoint=2 (5是第一个大于4的元素)
}
4. Java 9+新增方法
// 比较不相等的第一个元素索引
int[] a = {1,2,3};
int[] b = {1,4,3};
int diffIndex = Arrays.mismatch(a, b); // 返回1
// 数组切片
int[] subArray = Arrays.copyOfRange(a, 1, 3); // [2,3]
三、多维数组处理
1. 深度比较与哈希
int[][] matrix1 = {{1,2}, {3,4}};
int[][] matrix2 = {{1,2}, {3,4}};
// 浅比较(比较引用)
boolean shallowEqual = matrix1.equals(matrix2); // false
// 深比较(比较内容)
boolean deepEqual = Arrays.deepEquals(matrix1, matrix2); // true
// 深哈希
int hash = Arrays.deepHashCode(matrix1);
2. 多维数组转字符串
int[][] matrix = {{1,2}, {3,4}};
System.out.println(Arrays.toString(matrix));
// 输出:[[I@1dbd16a6, [I@7adf9f5f]
System.out.println(Arrays.deepToString(matrix));
// 输出:[[1, 2], [3, 4]]
四、性能与最佳实践
1. 性能比较
操作 | 时间复杂度 | 备注 |
---|---|---|
sort() | O(n log n) | 双轴快速排序 |
parallelSort() | O(n log n) | 并行处理更快 |
binarySearch() | O(log n) | 必须已排序 |
equals() | O(n) | 线性比较 |
copyOf() | O(n) | 系统级数组复制 |
2. 使用建议
- 小数组:直接使用
sort()
而非parallelSort()
- 频繁复制:考虑
System.arraycopy()
(更底层高效) - 列表转换:
Arrays.asList()
返回的是视图,修改会影响原数组 - 对象数组:确保元素实现了
Comparable
或提供Comparator
五、典型应用场景
1. 数据初始化
// 快速初始化测试数据
int[] testData = new int[1000];
Arrays.fill(testData, 1);
2. 集合转数组
List<String> list = new ArrayList<>();
String[] array = list.toArray(new String[0]); // 最佳实践
3. 快速查找
// 先排序后查找
Arrays.sort(largeArray);
int index = Arrays.binarySearch(largeArray, key);
4. 数组内容比较
// 测试用例验证
assertTrue(Arrays.equals(expectedArray, actualArray));
六、常见问题解决方案
1. 数组转List问题
// 错误方式(固定大小)
List<String> fixedList = Arrays.asList("a","b");
// 正确创建可变List
List<String> mutableList = new ArrayList<>(Arrays.asList("a","b"));
2. 多维数组处理
// 深拷贝多维数组
int[][] original = {{1,2}, {3,4}};
int[][] copy = Arrays.stream(original)
.map(arr -> Arrays.copyOf(arr, arr.length))
.toArray(int[][]::new);
3. 处理对象数组
// 自定义对象排序
Person[] people = {...};
Arrays.sort(people, Comparator
.comparing(Person::getLastName)
.thenComparing(Person::getFirstName));
Arrays工具类极大简化了数组操作,是Java开发者必须掌握的核心工具。合理使用这些方法可以显著提高代码的简洁性和执行效率。