代碼優化是提升系統吞吐量、降低延遲的關鍵環節。雖然單個優化點收益有限,但積少成多能帶來顯著效能提升。本文匯總 35 條經實戰驗證的 Java 優化策略,涵蓋對象創建、集合選擇、並發控制、I/O 處理等核心領域。
為類、方法、變量添加 final 可啟用編譯器內聯優化,提升執行效率。String 等核心類即採用此策略。
特別是字符串拼接場景,務必使用 StringBuilder/StringBuffer 替代 + 操作,避免產生大量臨時對象增加 GC 壓力。
局部變量存儲在棧中,讀寫速度遠快於堆中的實例/靜態變量,且隨方法結束自動釋放,無需 GC 介入。
數據庫連接、I/O 流等大對象用完必須在 finally 塊或 try-with-resources 中關閉,防止句柄洩漏導致系統資源耗盡。
循環條件中勿重複調用方法:
// 低效
for (int i = 0; i < list.size(); i++) { ... }
// 高效
for (int i = 0, len = list.size(); i < len; i++) { ... }
僅在真正需要時創建對象,將變量定義移至使用點附近,減少不必要的內存佔用。
異常創建涉及堆棧快照,開銷極大。僅用於真錯誤處理,不可作業務流程控制。
將異常捕獲移至循環外層,避免重複進入棧幀帶來的性能損耗。
ArrayList、HashMap、StringBuilder 等底層為數組,預估數據量時指定初始容量可避免多次擴容拷貝:
new ArrayList<>(5000);
new HashMap<>(1024); // 建議 2 的 N 次冪
原生方法優於手寫循環,經過 JVM 內部優化,複製速度極快。
val * 8 → val << 3,val / 2 → val >> 1,位運算直接作用於 CPU 指令集,效能最高。
避免循環內重複 new Object(),改為循環外聲明引用,內部賦值新實例,減少引用變量佔用。
數組訪問無邊界檢查、無方法調用開銷,性能優於 ArrayList。不確定大小才用 ArrayList。
Hashtable、Vector、StringBuffer 同步機制帶來額外開銷,單線程環境下無需使用。
僅引用不可變,數組內容仍可修改,且暴露 public 存在安全風險。
適用於資源控制、實例複用、數據共享三類場景,濫用反而增加類加載負擔。
靜態變量生命周期與類同步,會阻礙 GC 回收被引用對象,導致內存常駐。
調用 HttpSession.invalidate() 主動銷毀,防止序列化到磁盤產生高昂開銷。
ArrayList 實現 RandomAccess,下標訪問 O(1),for 循環優於 foreach(本質是 Iterator)。
縮小鎖粒度,僅同步必要片段,避免無關代碼阻塞。
編譯期進入常量池,運行期直接取值,且命名規範便於識別。
IDE 警告的未使用變量、導入包必須刪除,保持代碼整潔。
反射涉及動態類型解析,效率低下。啟動階段可反射預實例化緩存,運行期直接取用。
複用昂貴資源,避免頻繁創建銷毀開銷。
BufferedInputStream/Reader 等大幅減少系統調用次數,提升吞吐量。
隨機訪問多用 ArrayList,首尾增刪多用 LinkedList。
超過 3-4 個參數應封裝為 DTO 對象,符合面向對象原則,降低調用出錯率。
"const".equals(str) 避免 str 為 null 拋出 NPE。
Java 中 if (i == 1) 與 if (1 == i) 無語義差異,建議前者符合自然閱讀。
輸出類似 [I@18a992f,無實際意義,應用 Arrays.toString() 或循環打印。
long 轉 int 會截斷高位,導致數據錯誤,必須確認範圍安全。
防止內存洩漏,長生命周期集合必須手動清理過期數據。
效率排序:Integer.toString() > String.valueOf() > i + ""(底層用 StringBuilder)。
同時獲取 Key/Value 時,entrySet() 避免二次查找,性能最優。
每個 close() 獨立 try-catch,防止前者拋異常導致後者未執行造成資源洩漏。
性能優化是系統工程,需結合業務場景、壓測數據針對性調優。上述 35 條規範為基礎守則,持續重構、監控分析才能構建高效穩定的 Java 應用。