「不調用代碼優於調用優化後的代碼」—— 優先優化設計(減少對象創建、降低耦合、選擇高效算法),再優化編碼細節。善用 Profiler 定位熱點,避免盲目優化。
反例:String s = "a" + "b" + "c"; 循環中隱式創建大量 StringBuffer 及中間 String 對象。
正例:StringBuilder sb = new StringBuilder(); sb.append("a").append("b").append("c"); 單一緩衝區完成拼接。
數據:測試顯示優化後速度提升 2 倍(對象數從 8 個降至 4 個)。
| 策略 | 做法 | 收益 |
|---|---|---|
| 靜態化共享數據 | 無狀態工具類、常量、單例改為 static final | 減少實例創建,節省堆內存 |
| 不可變對象勿頻繁修改 | String、BigDecimal 等不可變類,拼接用 StringBuilder,計算用局部變量 | 避免產生大量臨時對象觸發 GC |
| 預分配容量 | new StringBuilder(1024), new ArrayList(expectedSize) | 避免擴容拷貝開銷 |
| 對象池復用 | 線程池、連接池、頻繁創建銷毀的大對象 (如 ByteBuffer) | 池化開銷 ≪ 頻繁 GC 開銷 |
| 就近初始化 | 在首次使用前才 new,縮小作用域 | 減少無用對象存活時間,助 GC |
if/while 替代 try/catch 進行業務判斷(如檢查 Map 是否包含 Key)。static final MyException INVALID_INPUT = new MyException(); 直接拋出,避免重複構造堆棧跟蹤開銷。Vector、Hashtable 所有方法同步,單線程環境下性能損耗巨大。
替代方案:ArrayList/HashMap (非線程安全) + 外部同步;或 JDK 5+ Collections.synchronizedList() 按需同步;高併發用 ConcurrentHashMap/CopyOnWriteArrayList。
public final class StringVector {
private String[] data;
private int size;
public StringVector(int initialCapacity) { data = new String[initialCapacity]; }
public void add(String s) {
if (s == null) return;
ensureCapacity(size + 1);
data[size++] = s;
}
private void ensureCapacity(int minCap) {
if (minCap > data.length) {
int newCap = data.length * 2;
data = Arrays.copyOf(data, newCap);
}
}
public String get(int index) {
return (index >= 0 && index < size) ? data[index] : null;
}
// ... remove, size 等
}
實測:百萬次添加/獲取,StringVector 耗時約為 Vector 的 1/3。
class Counter {
private int a, b;
private final Object lockA = new Object(), lockB = new Object();
public void incA() { synchronized(lockA) { a++; } }
public void incB() { synchronized(lockB) { b++; } } // 互不阻塞
}
| 場景 | 優化手段 | 關鍵點 |
|---|---|---|
| 文件/網絡讀寫 | 必須使用 BufferedInputStream/OutputStream, BufferedReader/Writer | 減少系統調用次數;頻繁 flush 反而降低性能 |
| 大量數據傳輸 | 用 System.arraycopy() 或 ByteBuffer 替換手工循環拷貝 | 原生內存拷貝,速度數量級提升 |
| 對象序列化 | 標記非必要字段 transient;考慮 Protobuf/Kryo 替代 Java 序列化 | 減少字節流體積,網絡傳輸顯著加速 |
| 熱點數據查詢 | 引入本地緩存 (Guava Cache, Caffeine) 或分布式緩存 | 避免重複 DB 查詢;注意緩存一致性策略 |
| JDBC 驅動選型 | Type 4 (純 Java) 部署簡單;Type 2 (本地庫) 高負載下性能略優 | 根據部署環境權衡;連接池 (HikariCP) 必須配置合理 |
private field,省去方法調用開銷。int len = list.size(); for(i=0;i<len;i++) 避免重複調用。final/static/private:助 JIT 內聯優化、常量傳播、逃逸分析。System.arraycopy():單條指令完成,比循環快 10 倍以上。性能優化是系統工程,而非拼湊技巧。先設計,後編碼,再測量,最後優化,方能事半功倍。