1. 概述
本文将介绍在Java中反转数组的多种实现方式。我们将展示基于纯Java 8的解决方案(包括原地修改和创建新数组两种方式),以及使用第三方库的两种方案:Apache Commons Lang 和 Google Guava。
2. 问题定义
核心需求是将数组元素的顺序完全反转。给定示例数组:
fruits = {"apples", "tomatoes", "bananas", "guavas", "pineapples"}
期望得到的结果是:
invertedFruits = {"pineapples", "guavas", "bananas", "tomatoes", "apples"}
接下来我们看看具体实现方案。
3. 使用传统for循环
最直观的思路是通过for循环实现数组反转:
void invertUsingFor(Object[] array) {
for (int i = 0; i < array.length / 2; i++) {
Object temp = array[i];
array[i] = array[array.length - 1 - i];
array[array.length - 1 - i] = temp;
}
}
⚠️ 关键点:
- 只需遍历数组一半长度(
array.length / 2
) - 通过临时变量
temp
交换对称位置的元素 - 原地修改原数组,不创建新对象
4. 使用Java 8 Stream API
利用Stream API可以更函数式地实现反转:
Object[] invertUsingStreams(Object[] array) {
return IntStream.rangeClosed(1, array.length)
.mapToObj(i -> array[array.length - i])
.toArray();
}
✅ 优势:
- 生成新数组而非修改原数组
- 使用
IntStream.rangeClosed
创建降序索引流 - 代码简洁但可读性稍弱
5. 使用Collections.reverse()
借助Java集合工具类实现:
public void invertUsingCollectionsReverse(Object[] array) {
List<Object> list = Arrays.asList(array);
Collections.reverse(list);
}
⚠️ 注意事项:
- 需先将数组转为List(
Arrays.asList
) - 修改原数组(因为
Arrays.asList
返回的是原数组的视图) - 代码可读性最佳,适合快速实现
6. 使用Apache Commons Lang
引入依赖后使用工具类方法:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.14.0</version>
</dependency>
public void invertUsingCommonsLang(Object[] array) {
ArrayUtils.reverse(array);
}
✅ 特点:
- 一行代码搞定,简单粗暴
- 原地修改数组
- 依赖轻量级(仅
commons-lang3
) - 最新版本可在Maven Central获取
7. 使用Google Guava
添加依赖后使用Guava的List工具:
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>31.0.1-jre</version>
</dependency>
public Object[] invertUsingGuava(Object[] array) {
List<Object> list = Arrays.asList(array);
List<Object> reversed = Lists.reverse(list);
return reversed.toArray();
}
⚠️ 关键区别:
- 创建新数组(不修改原数组)
- 需要两次转换:数组→List→反转List→数组
- 最新版本见Maven Central
8. 总结
本文对比了Java中数组反转的五种实现方案:
方案 | 是否修改原数组 | 代码复杂度 | 适用场景 |
---|---|---|---|
传统for循环 | ✅ 是 | 中等 | 无依赖环境 |
Java 8 Stream API | ❌ 否 | 较高 | 函数式编程场景 |
Collections.reverse() | ✅ 是 | 低 | 快速实现 |
Apache Commons Lang | ✅ 是 | 最低 | 已引入Commons Lang项目 |
Google Guava | ❌ 否 | 中等 | 已引入Guava项目 |
🔍 选择建议:
- 追求极致性能 → 传统for循环
- 代码简洁性 → Commons Lang
- 函数式风格 → Stream API
- 已有依赖 → 直接使用对应工具类
所有示例代码可在GitHub仓库获取(Maven项目,可直接导入运行)。