代碼優化非一蹴而就,而是無數微小改進的累積。本文精選 35 條經過生產驗證的 Java 優化建議,涵蓋語法層面、集合選型、並發控制、I/O 處理、JVM 調優等維度,附原理分析與代碼對比,助你寫出高效、穩健的 Java 代碼。
final:類/方法/變數加 final 利於 JIT 內聯優化,性能可提升 ~50%。StringBuilder 避免產生大量臨時 String 對象,減輕 GC 壓力。list.size() → for (int i=0, len=list.size(); i<len; i++)。if (need) { String s = heavy(); }。new ArrayList(1000)、new HashMap(1024) 避免擴容複製;HashMap 容量建議 2 的 N 次冪。System.arraycopy:原生優化,比手寫循環快數倍。val * 8 → val << 3、val / 2 → val >> 1,底層指令級優化(需加註釋)。Object obj = null; for(...) obj = new Object(); 避免佔用多個引用槽。int[] 比 ArrayList 輕量、訪問更快;不確定大小再用 List。HashMap/ArrayList/StringBuilder 替代 Hashtable/Vector/StringBuffer,避免同步開銷。public static final 陣列:引用不可變但元素可改,存在安全隱患;改用 Collections.unmodifiableList 或防禦性複製。static 引用導致對象常駐堆,隨類生命週期釋放,易造成記憶體洩漏。session.invalidate() 釋放不活躍會話,防止序列化風暴與堆積。ArrayList 實現 RandomAccess,for (int i=0; i<size; i++) 比 for-each(底層 Iterator)快;LinkedList 反之。static final 大寫:編譯期進入常量池,避免運行期計算;命名區分度高。The value... is not used 即刻清理。Method.invoke 慢 10-100 倍;啟動階段反射預熱緩存 Method 對象。BufferedReader/Writer/InputStream/OutputStream 大幅降低系統調用次數。ArrayList;頻繁頭尾增刪 → LinkedList。"const".equals(str) 避免 NullPointerException。if (i == 1):Java 無 C/C++ 賦值誤判風險,可讀性優先。toString():輸出 [I@hashcode;用 Arrays.toString() 或手寫格式化。long → int 截斷高位得非預期值;業務邏輯驗證範圍後再轉。remove:長期持有引用阻礙 GC,造成記憶體洩漏。toString() > String.valueOf() > +"":Integer.toString() 直達;String.valueOf 多空判;+"" 經 StringBuilder 最慢。entrySet():for (Entry<K,V> e : map.entrySet()) 單次查找拿到 Key+Value,避免二次 get(key)。try { a.close(); } catch... try { b.close(); } catch... 確保每個資源都被釋放,防止首個關閉拋異常導致後續資源洩漏。優化非盲目套用清單,而是理解底層原理(JIT、GC、記憶體模型、CPU 緩存),在性能熱點(Profiling 定位)針對性改進。過早優化是萬惡之源;無度量不優化。
建議工作流:JMH 基準測試 → 確定熱點 → 針對性優化 → 回歸驗證。養成「寫代碼時順手應用最佳實踐」的肌肉記憶,才是長久之計。