字符串在 Java 中不可變,反轉本質是創建新字符串。主要途徑:轉字符數組 → 反轉數組 → 構建新字符串。
public static String reverse1(String str) {
if (str == null) return null;
return new StringBuilder(str).reverse().toString();
}
public static String reverse2(String str) {
if (str == null) return null;
char[] arr = str.toCharArray();
for (int i = 0, j = arr.length - 1; i < j; i++, j--) {
char tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
return new String(arr);
}
public static String reverse3(String str) {
if (str == null || str.length() <= 1) return str;
return reverse3(str.substring(1)) + str.charAt(0);
}
public static String reverse4(String str) {
if (str == null) return null;
return str.chars()
.mapToObj(c -> (char) c)
.reduce("", (a, b) -> b + a, (a, b) -> b + a);
}
public static String reverse5(String str) {
if (str == null) return null;
ByteBuffer bb = ByteBuffer.wrap(str.getBytes(StandardCharsets.UTF_8));
byte[] bytes = new byte[bb.remaining()];
for (int i = bytes.length - 1; i >= 0; i--) {
bytes[i] = bb.get();
}
return new String(bytes, StandardCharsets.UTF_8);
}
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public class StringReverseBenchmark {
@Param({"10", "100", "1000", "10000"})
int length;
String input;
@Setup
public void setup() {
input = "a".repeat(length); // Java 11+
}
@Benchmark
public void stringBuilder() { new StringBuilder(input).reverse(); }
@Benchmark
public void charArraySwap() {
char[] arr = input.toCharArray();
for (int i = 0, j = arr.length - 1; i < j; i++, j--) {
char t = arr[i]; arr[i] = arr[j]; arr[j] = t;
}
}
@Benchmark
public void streamApi() {
input.chars().mapToObj(c -> (char) c).reduce("", (a, b) -> b + a, (a, b) -> b + a);
}
}
| 長度 | StringBuilder | char[] 交換 | Stream API |
|---|---|---|---|
| 10 | ~50 | ~40 | ~1,200 |
| 100 | ~150 | ~120 | ~15,000 |
| 1,000 | ~1,200 | ~1,000 | ~1,200,000 |
| 10,000 | ~12,000 | ~10,000 | ~120,000,000 |
new StringBuilder(str).reverse().toString() —— 代碼最簡、JDK 優化最充分、性能最穩健。+ 拼接(O(n²))、Stream API(物件創建開銷巨大)。StringBuffer 線程安全但較慢,單線程用 StringBuilder。public final class StringUtils {
private StringUtils() {}
public static String reverse(String str) {
if (str == null || str.length() <= 1) return str;
return new StringBuilder(str).reverse().toString();
}
/** 指定區間反轉 [start, end) */
public static String reverseRange(String str, int start, int end) {
if (str == null) return null;
int len = str.length();
start = Math.max(0, Math.min(start, len));
end = Math.max(start, Math.min(end, len));
char[] arr = str.toCharArray();
for (int i = start, j = end - 1; i < j; i++, j--) {
char t = arr[i]; arr[i] = arr[j]; arr[j] = t;
}
return new String(arr);
}
}
Java 字符串反轉,99% 場景用 StringBuilder.reverse()。面試手寫雙指針交換。理解不可變性、字符數組操作、性能差異,才是核心收穫。