使用 `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);
}
}
// 字元陣列雙指針交換
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()` 比內容。**