1. 概述

本文将介绍在Java中反转数组的多种实现方式。我们将展示基于纯Java 8的解决方案(包括原地修改和创建新数组两种方式),以及使用第三方库的两种方案:Apache Commons LangGoogle 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项目,可直接导入运行)。


原始标题:How to Invert an Array in Java

« 上一篇: BDDMockito 使用指南
» 下一篇: Java中的软引用