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 提供了 StringBuilder
和 StringBuffer
来处理可变字符串。它们都提供了 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 查看完整实现。