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

Java 字串比較陷阱:== 比較參考而非內容,導致邏輯錯誤

     編輯:程式設計綜合問答

錯誤代碼

public static String getBQ(String div) {
    if (div == "翻唱" || ...) // 錯誤:比較物件參考
        div = "音樂";
    return div;
}

// 呼叫端
String yu = bili.getData(q, "typename"); // 可能返回 new String("翻唱")
String o = "翻唱"; // 常數池字串
System.out.println(yu == o); // false!內容相同但參考不同

根本原因

  • == 比較**記憶體位址**(參考相等)。
  • 字串常數("翻唱")存放於常數池,new String() 或從外部讀取(資料庫、網路、檔案)產生的字串在堆上,**內容相同但參考不同**。
  • String.intern() 可手動放入常數池,但不建議濫用。

正確寫法

public static String getBQ(String div) {
    if ("翻唱".equals(div) || "VOCALOID·UTAU".equals(div) || ...) // 推薦常數在前防 NPE
        return "音樂";
    if ("MAD·AMV".equals(div) || ...)
        return "綜合";
    return "其它";
}

最佳實踐

  1. **永遠使用 equals() 比較字串內容**。
  2. 常數寫在 equals 左側避免 NullPointerException。
  3. 若需效能且確定字串已 intern(),可用 ==,但極少見。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved