首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Java StringBuffer 反轉字串比較:equals 比較的是物件參考而非內容

     編輯:程式設計疑難解答

使用 `StringBuffer` 反轉字串後,直接用 `s.equals(s1)` 比較原字串與反轉字串永遠回傳 `false`,因為 `StringBuffer` **未覆寫 `equals()`**,繼承自 `Object` 的 `equals` 比較的是**記憶體位址**。正確做法是先 `toString()` 轉為 `String` 再比較。

錯誤代碼

StringBuffer s = new StringBuffer(scan.nextLine());
StringBuffer s1 = new StringBuffer("");
for (int i = s.length() - 1; i >= 0; --i) {
    System.out.print(s.charAt(i));
    s1.append(s.charAt(i));
}
s1.toString();  // ❌ 忽略回傳值
s.toString();   // ❌ 忽略回傳值
System.out.print(s.equals(s1));  // ❌ 比較 StringBuffer 物件參考,永遠 false

正確代碼

String original = scan.nextLine();
StringBuffer reversedBuf = new StringBuffer(original).reverse();  // 一行完成反轉
String reversed = reversedBuf.toString();                         // 必須轉 String

System.out.println("反轉後: " + reversed);
System.out.println("是否回文: " + original.equals(reversed));      // ✅ String.equals 比較內容

關鍵點對照

類別equals() 行為正確比較方式
`String`比較**字元序列內容**直接 `str1.equals(str2)`
`StringBuffer` / `StringBuilder`**未覆寫**,繼承 `Object.equals` → 比較**參考位址**先 `toString()` 轉 `String` 再比較
陣列 `char[]`比較參考`Arrays.equals(arr1, arr2)` 或 `new String(arr1).equals(new String(arr2))`

完整可執行範例

import java.util.Scanner;

public class PalindromeCheck {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        System.out.print("請輸入一個字串:");
        String original = scan.nextLine();

        String reversed = new StringBuffer(original).reverse().toString();
        System.out.println("逆序後的字串是:" + reversed);

        boolean isPalindrome = original.equals(reversed);
        System.out.println("是否為回文:" + isPalindrome);
    }
}

延伸:不使用 StringBuffer 手寫反轉

// 字元陣列雙指針交換
char[] arr = original.toCharArray();
for (int i = 0, j = arr.length - 1; i < j; i++, j--) {
    char tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp;
}
String reversed = new String(arr);

記住口訣

**`StringBuffer`/`StringBuilder` 沒有 `equals` 內容比較,永遠要 `.toString()` 變成 `String` 才能用 `.equals()` 比內容。**

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved