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

Java 字符串比較陷阱:== vs equals() 導致統計程序邏輯錯誤

     編輯:程式設計疑難解答

問題代碼片段

// 錯誤:使用 == 比較字符串內容
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)引用相同快速返回

補充:代碼其他改進點

  1. 泛型:LinkedList<WordCount> 替代原始類型
  2. 資源管理:使用 try-with-resources 自動關閉流
  3. 命名規範:WordCount 替代 str_nu
  4. Map 優化:HashMap<String, Integer> 替代 List 線性查找,O(1) vs O(n)

Map 版本重構示例

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。

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