首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

從 PMD 靜態分析規則學習 Java 代碼優化最佳實踐

     編輯:Java 相關知識

前言

PMD、Checkstyle、FindBugs 等靜態分析工具不僅能發現缺陷,其內建規則更是凝聚了社區的性能優化與代碼質量經驗。本文從 PMD 核心規則提煉 8 條高頻優化建議。

優化建議清單

1. 局部變量單次賦值 → 声明 final

final int x = compute(); 編譯器將其視為常量傳播優化,減少運行時查找開銷。

2. String.startsWith 單字符檢查 → 改用 charAt(0)

// 差
\"Abc\".startsWith(\"A\");
// 優
\"Abc\".charAt(0) == 'A';

startsWith 內部有循環比較;charAt 直接數組索引,極快。

3. 字符串拼接 → 用 StringBuilder (非線程安全) / StringBuffer (線程安全)

直接 + 拼接每次產生新 String 對象;StringBuilder 內部擴容字符數組,追加操作均攤 O(1)。建議預估長度指定初始容量(默認僅 16 字符)。

4. String.indexOf 單字符查找 → 傳 char 而非 String

// 差
\"Abc\".indexOf(\"A\");
// 優
\"Abc\".indexOf('A');

底層實現分離:查找 char 走簡化循環,查找 String 需 KMP 等複雜算法。

5. 避免無參 new StringBuilder()

默認容量 16,擴容涉及數組複製。預估大致長度用 new StringBuilder(estimatedSize)。

6. 非線程安全單例 → 加 synchronized 或雙重檢查鎖 (DCL)

// 有風險
public static Foo getInstance() {
    if (instance == null) instance = new Foo();
    return instance;
}
// 修正
public static synchronized Foo getInstance() { ... }
// 或 DCL (volatile + 同步塊)

7. 覆寫 equals 必須同步覆寫 hashCode

HashMap 判斷鍵相等邏輯:hashCode 相等 && equals 返回 true。若只改 equals,相等對象可能落入不同桶,導致 HashSet 存入重複元素。

8. BigDecimal 構造浮點數 → 必須用 String 構造器

// 危險:二進制浮點誤差帶入
new BigDecimal(0.1);  // 實際值 0.10000000000000000555...
// 正確:精確表示
new BigDecimal(\"0.1\");

如何持續受益

  1. IDE 集成 PMD/SpotBugs 實時掃描。
  2. CI 流水線強制質量門檻。
  3. 定期閱讀規則文檔,理解背後原理而非機械修復。

靜態分析規則是「可執行的最佳實踐文檔」,善用之,代碼質量與性能雙提升。

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