本文介紹一種常見的字符串處理需求:僅反轉字符串中指定索引區間的字符。例如輸入 str="mmabcdfeffnn",反轉索引 2 到 9 區間(abcdfeff),得到 "mmffefdcbann"。
substring(0, start) —— 保持不變substring(start, end + 1) —— 核心處理對象substring(end + 1, length) —— 保持不變關鍵技巧:利用 StringBuffer(或 JDK 1.5+ StringBuilder)的 reverse() 方法實現區間反轉,最後三段拼接。
/**
* 字符串指定區間反轉工具類
*/
public class StringPartialReverse {
/**
* 反轉字符串指定區間 [start, end](含邊界)
*
* @param str 原字符串
* @param start 起始索引(包含)
* @param end 結束索引(包含)
* @return 處理後的字符串
*/
public static String reverseRange(String str, int start, int end) {
// 邊界校驗
if (str == null || start < 0 || end >= str.length() || start > end) {
return str;
}
// 1. 截取頭部
String head = str.substring(0, start);
// 2. 截取尾部
String tail = str.substring(end + 1);
// 3. 截取待反轉區間
String middle = str.substring(start, end + 1);
// 4. 反轉中間段(使用 StringBuilder 線程不安全但性能更好)
String reversedMiddle = new StringBuilder(middle).reverse().toString();
// 5. 拼接返回
return head + reversedMiddle + tail;
}
public static void main(String[] args) {
String original = "mmabcdefnn";
int start = 2, end = 7;
String result = reverseRange(original, start, end);
System.out.println("原字符串: " + original);
System.out.println("反轉後: " + result); // 輸出: mmfedcba nn
}
}
| 技術點 | 說明 |
|---|---|
| StringBuilder vs StringBuffer | 單線程環境推薦 StringBuilder(非同步,性能更高);多線程共享才用 StringBuffer |
| substring 索引語義 | substring(begin, end) 包含 begin,不包含 end,故區間結束需 end + 1 |
| 邊界防護 | 生產代碼必須校驗 null、索引越界、start > end 等異常情況 |
| 不可變性 | String 不可變,所有操作產生新對象,原字符串不變 |
CharBuffer 分塊反轉,避免 OOM掌握「三段式拆分 + StringBuilder.reverse() + 拼接」模式,可高效解決各類字符串區間變換問題,代碼簡潔且性能優異。