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

Java 效能優化實戰:從物件建立、異常處理、多執行緒到 I/O 的 5 大優化策略

     編輯:Java 相關知識

核心原則

優化優先序:**改變設計 > 優化代碼**。不調用代碼比調用優化後代碼更快。良好設計自然精簡代碼、提升效能。

一、物件建立與大小控制

字串拼接:String vs StringBuffer/StringBuilder

// 低效:產生 5 個物件
String name = new String("HuangWeiFeng");
System.out.println(name + " is my name");

// 高效:僅 4 個物件,速度提升 2 倍
StringBuffer name = new StringBuffer("HuangWeiFeng");
System.out.println(name.append(" is my name.").toString());

連續拼接差距更大:

// 產生 8 個物件
String s = new StringBuffer("A"); s += "B"; s += "C";

// 僅 4 個物件
StringBuffer sb = new StringBuffer("A"); sb.append("B").append("C").toString();

五大物件優化原則

  1. 善用 static:不隨實例變化的欄位宣告 static,所有實例共享
  2. 不可變物件勿頻繁修改:String 每次修改產生新物件,改用 StringBuilder
  3. 預設容量足夠才用預設:StringBuilder 預設 16 字元,大量拼接請指定初始容量 new StringBuilder(1024)
  4. 物件池模式:短生命週期、高頻建立銷毀的物件(資料庫連線、執行緒)用池管理
  5. 就近初始化:僅在需要的作用域建立物件
// 悪例
SomeObject so = new SomeObject();
if (x == 1) foo = so.getXX();

// 優化
if (x == 1) {
    SomeObject so = new SomeObject();
    foo = so.getXX();
}

二、異常處理

  • 勿用 try-catch 控制業務流程:能用 if/while 判斷的別用異常
  • 重用異常物件:捕獲處理時復用既有異常實例,避免頻繁 new Exception() 開銷

三、多執行緒與同步優化

案例:自訂 StringVector 替代 Vector

Vector 所有方法 synchronized,單執行緒下純屬浪費;且泛型擦除導致型別檢查開銷。自訂型別安全、非同步的 StringVector 效能大幅提升。

public class StringVector {
    private String[] data; private int count;
    public StringVector() { this(10); }
    public StringVector(int size) { data = new String[size]; }
    public void add(String s) {
        if (s == null) return;
        ensureCapacity(count + 1);
        data[count++] = s;
    }
    private void ensureCapacity(int min) {
        if (min > data.length) {
            String[] nd = new String[data.length * 2];
            System.arraycopy(data, 0, nd, 0, count);
            data = nd;
        }
    }
    public String getStringAt(int i) {
        if (i < 0 || i >= count) return null;
        return data[i];
    }
}

測試 100 萬次增刪查,StringVector 耗時約為 Vector 的 1/3。

同步三原則

  1. 最小化同步範圍:同步方法優於同步區塊
  2. 避免不必要同步:單執行緒環境移除 synchronized
  3. 多鎖細化並發:不同資料用不同鎖
class Counter {
    private static int var1; private static final Object lock1 = new Object();
    private static int var2; private static final Object lock2 = new Object();
    public static void inc1() { synchronized(lock1) { var1++; } }
    public static void inc2() { synchronized(lock2) { var2++; } }
}

四、I/O 優化

  1. 務必使用緩衝:BufferedInputStream/OutputStream、BufferedReader/Writer,除非頻繁 flush()
  2. OutputStream 優於 Writer:Unicode→Byte 轉換開銷大,能早轉換或直接用 Byte 流
  3. 序列化標記 transient:可重建/原子型別欄位標記 transient,減少網路傳輸體積
  4. 熱數據快取:頻繁讀取、少變動的資料(資料庫結果集)放入記憶體快取
  5. 選對 JDBC 驅動:Type 4 (純 Java) 便於部署,Type 2 (原生) 特定場景或許更快,實測為準

五、編碼微優化清單

  • 優先使用區域變數(棧分配,速度最快)
  • 避免同類中透過 getter/setter 存取自身欄位(直接訪問 this.field)
  • 循環不變量外提:for (int i=0; i<list.size(); i++) → int n=list.size(); for(int i=0;i<n;i++)
  • 善用 final、private、static 協助 JIT 內聯優化
  • 大量陣列複製用 System.arraycopy()(原生優化)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved