Java数组操作:toBeBetterJavaer Arrays工具类详解

Java数组操作:toBeBetterJavaer Arrays工具类详解

【免费下载链接】toBeBetterJavaer JavaBooks:这是一个由多位资深Java开发者共同维护的Java学习资源库,内含大量高质量的Java教程、视频、博客等资料,可以帮助Java学习者快速提升技术水平。 【免费下载链接】toBeBetterJavaer 项目地址: https://gitcode.com/GitHub_Trending/to/toBeBetterJavaer

在Java开发中,数组(Array)是一种基础且常用的数据结构,但原生数组操作往往繁琐且容易出错。java.util.Arrays工具类封装了大量高效数组操作方法,能显著提升开发效率。本文基于toBeBetterJavaer项目数组基础文档Arrays工具类详解,系统讲解Arrays工具类的核心功能与实战应用。

一、Arrays工具类概述

Arrays类是Java标准库提供的数组操作工具类,位于java.util包下,包含静态方法用于数组的创建、排序、查找、比较、转换等操作。其设计目标是简化数组操作复杂度,避免重复编码。

核心功能模块

  • 创建与填充:copyOf()/copyOfRange()/fill()
  • 比较与哈希:equals()/hashCode()
  • 排序与检索:sort()/binarySearch()
  • 转换与工具:asList()/toString()/stream()

二、数组创建与填充

1. copyOf:数组截取与扩容

该方法通过复制原数组创建新数组,支持长度调整。当目标长度小于原数组时截取,大于时用默认值填充(对象类型为null,基本类型为对应零值)。

String[] intro = {"沉", "默", "王", "二"};
String[] shortArr = Arrays.copyOf(intro, 3); // 截取前3个元素
String[] longArr = Arrays.copyOf(intro, 5);  // 扩容并填充null

System.out.println(Arrays.toString(shortArr)); // [沉, 默, 王]
System.out.println(Arrays.toString(longArr));  // [沉, 默, 王, 二, null]

ArrayList的动态扩容机制即使用此方法:ArrayList.grow()通过Arrays.copyOf()实现底层数组的扩容。

2. copyOfRange:范围复制

按指定索引范围复制数组,语法为copyOfRange(原数组, 起始索引, 结束索引),含头不含尾。

String[] intro = {"沉", "默", "王", "二"};
String[] rangeArr = Arrays.copyOfRange(intro, 1, 3); // 复制索引1-2的元素
System.out.println(Arrays.toString(rangeArr)); // [默, 王]

3. fill:批量填充

快速初始化数组元素,支持全量填充或指定范围填充。

String[] arr = new String[4];
Arrays.fill(arr, "沉默王二"); 
System.out.println(Arrays.toString(arr)); // [沉默王二, 沉默王二, 沉默王二, 沉默王二]

三、数组比较与哈希

1. equals:数组相等性判断

比较两个数组是否逻辑相等(长度相同且对应位置元素相等),支持所有基本类型和引用类型数组。

int[] a = {1, 2, 3};
int[] b = {1, 2, 3};
int[] c = {1, 3, 2};

System.out.println(Arrays.equals(a, b)); // true
System.out.println(Arrays.equals(a, c)); // false

2. hashCode:数组哈希值计算

生成数组的哈希码,用于集合中的快速查找。两个相等的数组会生成相同哈希码。

String[] intro = {"沉", "默", "王", "二"};
System.out.println(Arrays.hashCode(intro)); // 868681617

四、排序与检索

1. sort:高效排序

对数组进行原地排序,基本类型使用双轴快速排序,引用类型使用TimSort算法。

String[] words = {"banana", "apple", "cherry"};
Arrays.sort(words);
System.out.println(Arrays.toString(words)); // [apple, banana, cherry]

2. binarySearch:二分查找

已排序数组中快速定位元素,返回索引值;未找到时返回-(插入点+1)

int[] nums = {10, 20, 30, 40};
Arrays.sort(nums);
int index = Arrays.binarySearch(nums, 30); 
System.out.println(index); // 2(元素30的索引)

五、数组转换工具

1. asList:数组转List

将数组转换为List视图,注意返回的是Arrays.ArrayList(固定长度),需二次包装为java.util.ArrayList才能进行增删操作。

String[] intro = {"沉", "默", "王", "二"};
List<String> fixedList = Arrays.asList(intro); // 固定长度
List<String> mutableList = new ArrayList<>(fixedList); // 可变列表

2. toString:数组格式化输出

将数组转换为可读性强的字符串表示,避免直接打印数组对象时显示内存地址。

int[] nums = {1, 2, 3};
System.out.println(nums); // [I@3d075dc0(直接打印对象)
System.out.println(Arrays.toString(nums)); // [1, 2, 3](格式化输出)

3. stream:数组转流

Java 8新增功能,将数组转换为Stream流,支持函数式操作。

int[] nums = {1, 2, 3, 4};
long count = Arrays.stream(nums)
                  .filter(n -> n % 2 == 0)
                  .count();
System.out.println(count); // 2(偶数个数)

六、高级操作:setAll与parallelPrefix

1. setAll:函数式填充

Java 8新增,通过索引函数生成数组元素,支持动态计算。

int[] squares = new int[5];
Arrays.setAll(squares, i -> i * i); // 索引平方
System.out.println(Arrays.toString(squares)); // [0, 1, 4, 9, 16]

2. parallelPrefix:并行累积计算

对数组元素进行累积操作,支持并行计算提升性能。

int[] arr = {1, 2, 3, 4};
Arrays.parallelPrefix(arr, (left, right) -> left + right); 
System.out.println(Arrays.toString(arr)); // [1, 3, 6, 10](累加效果)

七、实战应用场景

1. 数组深拷贝

结合copyOfRange实现多维数组的部分复制:

int[][] matrix = {{1,2},{3,4},{5,6}};
int[][] subMatrix = Arrays.copyOfRange(matrix, 1, 3); // 复制行1-2

2. 自定义对象排序

对引用类型数组排序时,需实现Comparable接口或提供Comparator

Person[] people = {new Person("张三", 20), new Person("李四", 18)};
Arrays.sort(people, Comparator.comparingInt(Person::getAge));

3. 数组去重

利用HashSet实现数组去重:

String[] arr = {"a", "b", "a", "c"};
String[] unique = Arrays.stream(arr).distinct().toArray(String[]::new);

八、注意事项

  1. 数组与集合转换陷阱Arrays.asList()返回的列表不支持add/remove操作,需用new ArrayList<>(Arrays.asList())转为可变列表。

  2. 基本类型与包装类型:避免int[]Integer[]混用,如Arrays.asList(int[])会返回List<int[]>而非List<Integer>

  3. 线程安全:Arrays工具类的方法均为静态方法,无状态,线程安全。

  4. 性能考量parallelPrefixparallelSort在大数据量时性能优势明显,小数据量可能因线程开销导致效率降低。

九、项目资源索引

通过掌握Arrays工具类,开发者可大幅减少数组操作的样板代码,提升代码可读性和执行效率。建议结合项目示例代码深入理解各方法的实现细节与性能特性。

【免费下载链接】toBeBetterJavaer JavaBooks:这是一个由多位资深Java开发者共同维护的Java学习资源库,内含大量高质量的Java教程、视频、博客等资料,可以帮助Java学习者快速提升技术水平。 【免费下载链接】toBeBetterJavaer 项目地址: https://gitcode.com/GitHub_Trending/to/toBeBetterJavaer

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值