優化優先序:**改變設計 > 優化代碼**。不調用代碼比調用優化後代碼更快。良好設計自然精簡代碼、提升效能。
// 低效:產生 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();
static,所有實例共享String 每次修改產生新物件,改用 StringBuilderStringBuilder 預設 16 字元,大量拼接請指定初始容量 new StringBuilder(1024)// 悪例
SomeObject so = new SomeObject();
if (x == 1) foo = so.getXX();
// 優化
if (x == 1) {
SomeObject so = new SomeObject();
foo = so.getXX();
}
if/while 判斷的別用異常new Exception() 開銷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。
synchronizedclass 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++; } }
}
BufferedInputStream/OutputStream、BufferedReader/Writer,除非頻繁 flush()transient,減少網路傳輸體積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()(原生優化)