這十條代碼優化法則,如果都注意到了,程序效率將提升N倍

這十條代碼優化法則,如果都注意到了,程序效率將提升N倍

(1)靜態類、單例類、工廠類將它們的構造函數置為private

這是因為靜態類、單例類、工廠類這種類本來我們就不需要外部將它們new出來,將構造函數置為private之後,保證了這些類不會產生實例對象。

(2)使用最有效率的方式去遍歷Map

遍歷Map的方式有很多,通常場景下我們需要的是遍歷Map中的Key和Value,那麼推薦使用的、效率最高的方式是:

public static void main(String[] args)

{ HashMap hm = new HashMap(); hm.put("111", "222"); Set> entrySet = hm.entrySet(); Iterator> iter = entrySet.iterator(); while (iter.hasNext()) { Map.Entry entry = iter.next(); System.out.println(entry.getKey() + "\t" + entry.getValue()); }

}
如果你只是想遍歷一下這個Map的key值,那用"Set keySet = hm.keySet();"會比較合適一些



(3)不要對數組使用toString()方法

看一下對數組使用toString()打印出來的是什麼:

public static void main(String[] args){ int[] is = new int[]{1, 2, 3}; System.out.println(is.toString());}

結果是:

[I@18a992f

本意是想打印出數組內容,卻有可能因為數組引用is為空而導致空指針異常。不過雖然對數組toString()沒有意義,但是對集合toString()是可以打印出集合裡面的內容的,因為集合的父類AbstractCollections重寫了Object的toString()方法。

(4)long或者Long初始賦值時,使用大寫的L而不是小寫的l,因為字母l極易與數字1混淆,這個點非常細節,值得注意

(5)程序運行過程中避免使用反射

關於,請參見反射。反射是Java提供給用戶一個很強大的功能,功能強大往往意味著效率不高。不建議在程序運行過程中使用尤其是頻繁使用反射機制,特別是Method的invoke方法,如果確實有必要,一種建議性的做法是將那些需要通過反射加載的類在項目啟動的時候通過反射實例化出一個對象並放入內存----用戶只關心和對端交互的時候獲取最快的響應速度,並不關心對端的項目啟動花多久時間。

這十條代碼優化法則,如果都注意到了,程序效率將提升N倍

(6)切記以常量定義的方式替代魔鬼數字,魔鬼數字的存在將極大地降低代碼可讀性,字符串常量是否使用常量定義可以視情況而定

(7)不要創建一些不使用的對象,不要導入一些不使用的類

這毫無意義,如果代碼中出現"The value of the local variable i is not used"、"The import java.util is never used",那麼請刪除這些無用的內容

(8)所有重寫的方法必須保留@Override註解

這麼做有三個原因:

(1)清楚地可以知道這個方法由父類繼承而來

(2)getObject()和get0bject()方法,前者第四個字母是"O",後者第四個子母是"0",加了@Override註解可以馬上判斷是否重寫成功

(3)在抽象類中對方法簽名進行修改,實現類會馬上報出編譯錯誤

(9)儘量重用對象

特別是String對象的使用,出現字符串連接時應該使用StringBuilder/StringBuffer代替。由於Java虛擬機不僅要花時間生成對象,以後可能還需要花時間對這些對象進行垃圾回收和處理,因此,生成過多的對象將會給程序的性能帶來很大的影響。

(10)儘量指定類、方法的final修飾符

帶有final修飾符的類是不可派生的。在Java核心API中,有許多應用final的例子,例如java.lang.String,整個類都是final的。為類指定final修飾符可以讓類不可以被繼承,為方法指定final修飾符可以讓方法不可以被重寫。如果指定了一個類為final,則該類所有的方法都是final的。Java編譯器會尋找機會內聯所有的final方法,內聯對於提升Java運行效率作用重大,具體參見Java運行期優化。此舉能夠使性能平均提高50%。

這十條代碼優化法則,如果都注意到了,程序效率將提升N倍

(11)避免Random實例被多線程使用,雖然共享該實例是線程安全的,但會因競爭同一seed 導致的性能下降,JDK7之後,可以使用ThreadLocalRandom來獲取隨機數

解釋一下競爭同一個seed導致性能下降的原因,比如,看一下Random類的nextInt()方法實現:

 1 public int nextInt() { 2 return next(32); 3 }

調用了next(int bits)方法,這是一個受保護的方法:

1 protected int next(int bits) {2 long oldseed, nextseed;3 AtomicLong seed = this.seed;4 do {5 oldseed = seed.get();6 nextseed = (oldseed * multiplier + addend) & mask;7 } while (!seed.compareAndSet(oldseed, nextseed));8 return (int)(nextseed >>> (48 - bits));9 }

而這邊的seed是一個全局變量:

1 /**2 * The internal state associated with this pseudorandom number generator.3 * (The specs for the methods in this class describe the ongoing4 * computation of this value.)5 */6 private final AtomicLong seed;

多個線程同時獲取隨機數的時候,會競爭同一個seed,導致了效率的降低。


分享到:


相關文章: