代碼層面的優化雖無法替代架構設計與演算法優化,但在高併發、大數據、低延遲場景下,累積的微小優化往往能帶來顯著吞吐提升。本文整理 28 條經驗準則,按優化維度分類,附原理分析與代碼對比。
final 修飾類/方法:允許 JIT 編譯器內聯優化,消除虛方法調用開銷。String、包裝類均為 final。StringBuilder(單線程)或 StringBuffer(線程安全),避免產生大量中間 String 對象觸發頻繁 GC。try-with-resources (Java 7+) 確保資源釋放,避免句柄洩漏導致系統資源耗盡。for (int i=0, len=list.size(); i<len; i++) 避免每次調用 size()。new ArrayList(5000)、new HashMap(1024) 避免擴容拷貝。HashMap 容量建議 2 的 N 次冪,負載因子 0.75 時閾值為 capacity*0.75。System.arraycopy():原生方法,JIT 內聯優化,比手寫循環快數倍。x * 8 → x << 3,x / 16 → x >> 4(JIT 通常會自動優化,手寫可提高可讀性)。Object obj = null; for(...) { obj = new Object(); } 僅佔用一個引用槽位。Vector/Hashtable/StringBuffer 同步開銷大,已被淘汰。public static final:引用不可變,但數組內容可變,存在安全隱患;改用 Collections.unmodifiableList 或防御性複製。volatile 修飾實例變量。HttpSession.invalidate() 釋放內存,避免序列化/持久化開銷。ArrayList 實現 RandomAccess,for(i=0; i<size; i++) 比 for-each(迭代器)快;LinkedList 則相反。static final 大寫命名:編譯期進入常量池,運行期直接取值;命名規範便於識別。The value of the local variable is not used 應清理,減少類文件體積與類加載時間。Method/Constructor 對象供運行期複用。HikariCP、ThreadPoolExecutor 重用昂貴資源,避免頻繁創建銷毀開銷。BufferedInputStream/Reader、BufferedOutputStream/Writer 減少系統調用次數,提升吞吐數量級。"const".equals(str) 避免 NullPointerException。long → int 可能截斷高位,轉換前校驗範圍。toString() > String.valueOf() > +"":Integer.toString() 直接調用;String.valueOf() 內部調用 toString() 並做空檢查;+"" 隱式創建 StringBuilder 追加再 toString(),最慢。String.valueOf():11ms
Integer.toString():5ms
i + "":25ms
性能優化是權衡的藝術:可讀性 > 正確性 > 性能。上述準則在熱點路徑(高頻調用、大數據處理、核心邏輯)應用收益最大。建議配合 JMH (Java Microbenchmark Harness) 進行微基準測試驗證優化效果,避免「過早優化」陷阱。JVM JIT 編譯器已能自動完成大量優化(內聯、逃逸分析、標量替換),開發者應專注於算法複雜度、數據結構選擇、資源管理等高層決策。