// 錯誤:使用 == 比較字符串內容
if (words.get(i).word == "ccc") { ... }
if (words.get(i).word == a) { ... }
== 比較的是引用地址 (記憶體位置)equals() 比較的是字符序列內容== 偶然通過,但不可靠// 正確:使用 equals 比較內容
if ("ccc".equals(words.get(i).word)) { ... } // 防空指針寫法推薦
if (a.equals(words.get(i).word)) { ... }
// 或使用 Objects.equals (Java 7+)
if (Objects.equals("ccc", words.get(i).word)) { ... }
private static int getIndex(List<WordCount> words, String target) {
for (int i = 0; i < words.size(); i++) {
if (target.equals(words.get(i).word)) { // 修正點
return i;
}
}
return -1;
}
// 統計輸出也需修正
for (WordCount wc : words) {
System.out.println("單詞:" + wc.word + " " + wc.num);
if ("ccc".equals(wc.word)) System.out.println("here");
}
if ("ccc".equals(words.get(1).word)) System.out.println("abcd");
| 場景 | 推薦寫法 | 原因 |
|---|---|---|
| 常量與變量比較 | "const".equals(var) | 避免空指針異常 |
| 兩個變量比較 | Objects.equals(a, b) | 雙向防空,代碼清晰 |
| 忽略大小寫 | a.equalsIgnoreCase(b) | 業務需求 |
| 性能敏感且確定非空 | a == b || a.equals(b) | 引用相同快速返回 |
LinkedList<WordCount> 替代原始類型WordCount 替代 str_nuHashMap<String, Integer> 替代 List 線性查找,O(1) vs O(n)Map<String, Integer> wordCount = new HashMap<>();
while (scanner.hasNext()) {
String word = scanner.next();
wordCount.merge(word, 1, Integer::sum);
}
wordCount.forEach((word, count) ->
System.out.println("單詞:" + word + " " + count));
Java 字符串比較永遠用 equals(),除非你確定在比較引用身份。 這是 Java 開發中最高頻的低級錯誤,也是面試必考點。養成「常量調用 equals」習慣,能避免 99% 的字符串比較 Bug。