1. 概述

在本教程中,我们将学习在 Java 中反转字符串的几种常见方式。

我们会从最基础的 for 循环开始,逐步介绍 StringBuilder、Stream API 以及 Apache Commons 等工具的使用方式。同时,我们也会演示如何反转句子中单词的顺序。

目标是为有经验的 Java 开发者提供一个简洁、实用的参考指南。


2. 使用传统的 for 循环

Java 中的字符串是不可变的(immutable),因此我们不能直接修改字符串内容。要反转一个字符串,必须构造一个新的字符串。

一个简单粗暴的方式就是使用 for 循环从后往前遍历字符,并拼接成新字符串:

public String reverse(String input) {
    if (input == null) {
        return input;
    }

    String output = "";
    for (int i = input.length() - 1; i >= 0; i--) {
        output = output + input.charAt(i);
    }

    return output;
}

✅ 优点:简单直观,无需依赖外部类库
❌ 缺点:字符串拼接效率较低(频繁创建新字符串对象)

我们可以通过一个单元测试验证这个方法的行为:

@Test
public void whenReverseIsCalled_ThenCorrectStringIsReturned() {
    String reversed = ReverseStringExamples.reverse("cat");
    String reversedNull = ReverseStringExamples.reverse(null);
    String reversedEmpty = ReverseStringExamples.reverse(StringUtils.EMPTY);

    assertEquals("tac", reversed);
    assertNull(reversedNull);
    assertEquals(StringUtils.EMPTY, reversedEmpty);
}

3. 使用 StringBuilder

Java 提供了 StringBuilderStringBuffer 来处理可变字符串。它们都提供了 reverse() 方法,可以非常方便地实现字符串反转。

示例代码如下:

public String reverseUsingStringBuilder(String input) {
    if (input == null) {
        return null;
    }

    StringBuilder output = new StringBuilder(input).reverse();
    return output.toString();
}

✅ 优点:代码简洁,性能较好
❌ 缺点:StringBuilder 是可变对象,需注意线程安全(多线程环境下应使用 StringBuffer


4. 使用 Stream API

Java 8 引入的 Stream API 也可以用来处理字符串反转,虽然不是最高效的方式,但在某些函数式编程场景下很实用。

4.1 使用 IntStream.range()

public static String reverseUsingIntStreamRangeMethod(String str) {
    if (str == null) {
        return null;
    }

    char[] charArray = str.toCharArray();
    return IntStream.range(0, str.length())
      .mapToObj(i -> charArray[str.length() - i - 1])
      .collect(StringBuilder::new, StringBuilder::append, StringBuilder::append)
      .toString();
}

✅ 优点:函数式风格,适合教学或演示
❌ 缺点:性能略逊于 StringBuilder

4.2 使用 Stream.of()

public static String reverseUsingStreamOfMethod(String str) {
    if (str == null) {
        return null;
    }

    return Stream.of(str)
      .map(string -> new StringBuilder(string).reverse())
      .collect(Collectors.joining());
}

✅ 优点:结合 StringBuilder.reverse(),代码简洁
❌ 缺点:仅适用于 Java 8+

4.3 使用 String.chars()(Java 9+)

public static String reverseUsingCharsMethod(String str) {
    if (str == null) {
        return null;
    }

    return str.chars()
      .mapToObj(c -> (char) c)
      .reduce("", (a, b) -> b + a, (a2, b2) -> b2 + a2);
}

✅ 优点:使用了 Java 9 的新特性
❌ 缺点:仅限 Java 9 及以上版本使用


5. 使用 Apache Commons

Apache Commons Lang 是一个非常流行的 Java 工具库,其中的 StringUtils 类提供了 reverse() 方法,可以非常方便地实现字符串反转。

添加 Maven 依赖:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.12.0</version>
</dependency>

使用方式非常简单:

public String reverseUsingApacheCommons(String input) {
    return StringUtils.reverse(input);
}

✅ 优点:

  • 简洁易用
  • 自动处理 null 输入(null-safe)

❌ 缺点:需要引入第三方库


6. 反转句子中单词的顺序

有时候我们想反转的是句子中单词的顺序,而不是字符的顺序。例如:

输入:"Java is fun"
输出:"fun is Java"

6.1 原生实现

我们可以使用 split() 方法将句子拆分成单词数组,然后倒序拼接:

public String reverseTheOrderOfWords(String sentence) {
    if (sentence == null) {
        return null;
    }

    StringBuilder output = new StringBuilder();
    String[] words = sentence.split(" ");

    for (int i = words.length - 1; i >= 0; i--) {
        output.append(words[i]).append(" ");
    }

    return output.toString().trim();
}

6.2 使用 Apache Commons

Apache Commons 提供了更简洁的方式:

public String reverseTheOrderOfWordsUsingApacheCommons(String sentence) {
    return StringUtils.reverseDelimited(sentence, ' ');
}

✅ 优点:一行代码搞定,null-safe
❌ 缺点:依赖 Apache Commons


7. 总结

方法 优点 缺点
for 循环 简单直观 效率低,代码冗长
StringBuilder 高效、简洁 不适用于函数式编程场景
Stream API 函数式风格 性能略低
Apache Commons 易用、null-safe 需引入第三方库

📌 建议

  • 日常开发推荐使用 StringBuilder.reverse(),简单高效。
  • 函数式编程场景可考虑 Stream API。
  • 若项目已引入 Apache Commons,使用 StringUtils.reverse() 更加省心。

所有示例代码已上传至 GitHub,可前往 ReverseStringExamples 查看完整实现。


原始标题:How to Reverse a String in Java

« 上一篇: NanoHTTPD 使用指南
» 下一篇: Apache Mesos 指南