錯誤代碼
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 "其它";
}
最佳實踐
- **永遠使用
equals() 比較字串內容**。
- 常數寫在
equals 左側避免 NullPointerException。
- 若需效能且確定字串已
intern(),可用 ==,但極少見。