首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java 字串反轉的 5 種經典實作方式與效能比較

     編輯:Java 綜合教學

前言

字串反轉是面試與日常開發常見課題。本文介紹 Java 中 5 種主流實作方式,附完整代碼與測試結果。

方式一:陣列雙指針交換

public String reverseByArray(String str) {
    if (str == null || str.length() <= 1) return str;
    char[] ch = str.toCharArray();
    for (int i = 0; i < ch.length / 2; i++) {
        char temp = ch[i];
        ch[i] = ch[ch.length - i - 1];
        ch[ch.length - i - 1] = temp;
    }
    return new String(ch);
}

原地交換,空間複雜度 O(n),時間複雜度 O(n/2),效能極佳。

方式二:堆疊(Stack)後進先出特性

public String reverseByStack(String str) {
    if (str == null || str.length() <= 1) return str;
    Stack stack = new Stack<>();
    for (char c : str.toCharArray()) stack.push(c);
    char[] ch = str.toCharArray();
    for (int i = 0; i < ch.length; i++) ch[i] = stack.pop();
    return new String(ch);
}

利用堆疊 LIFO 特性,代碼直觀但額外空間開銷較大。

方式三:逆序遍歷 + StringBuilder

public String reverseByBuilder(String str) {
    if (str == null || str.length() <= 1) return str;
    StringBuilder sb = new StringBuilder();
    for (int i = str.length() - 1; i >= 0; i--) sb.append(str.charAt(i));
    return sb.toString();
}

最常見寫法,StringBuilder 非線程安全、效能優於 StringBuffer。

方式四:位運算(XOR)交換

public String reverseByBit(String str) {
    if (str == null || str.length() <= 1) return str;
    char[] ch = str.toCharArray();
    int len = str.length();
    for (int i = 0; i < len / 2; i++) {
        ch[i] ^= ch[len - 1 - i];
        ch[len - 1 - i] ^= ch[i];
        ch[i] ^= ch[len - 1 - i];
    }
    return new String(ch);
}

無需暫存變數的交換技巧,屬於「秀技巧」類,實務較少用。

方式五:遞歸

public String reverseByRecursive(String str) {
    if (str == null || str.length() == 0) return str;
    if (str.length() == 1) return str;
    return reverseByRecursive(str.substring(1)) + str.charAt(0);
}

優雅但效能最差:大量字串拼接與遞歸呼叫,易導致堆疊溢位,不建議生產環境使用。

完整測試類

public class Reverse {
    private final String str;
    public Reverse(String str) { this.str = str; }
    // 上述 5 個方法...
    public static void main(String[] args) {
        String s = "123456";
        Reverse r = new Reverse(s);
        System.out.println(r.reverseByArray());
        System.out.println(r.reverseByStack());
        System.out.println(r.reverseByBuilder());
        System.out.println(r.reverseByBit());
        System.out.println(r.reverseByRecursive(s));
    }
}

執行結果

輸出均為 654321

建議選擇

  • 生產環境:優先 方式三(StringBuilder 逆序遍歷),代碼簡潔、效能優、可讀性高。
  • 極致效能:方式一(陣列雙指針)避免物件創建開銷。
  • 教學/面試展示:方式二、四、五各有特色,理解底層原理即可。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved