天天看點

影響Java代碼性能的一些細節

  讀《Effective

Java》的一些收獲,會持續添加。

  Integer和

int的差別:

  int是

Java基本資料類型,表示一個整型值。Integer是對

int基本類型的一個封裝(每一個 Integer對象中都包含一個"private final int value;"的成員變量),提供了一系列的通用方法,如

int與 String的互相轉換,把 int值轉換為 long、char等其他基本類型。相應地,兩個封裝了相同的 int值的

Integer對象在使用"=="比較的時候不一定會傳回 true。例如下邊的代碼 b的值為 false:

  Integer類實作了 Comparable接口,具體的實作方法是比較兩個

Integer對象封裝的 int值:

  通過看

Integer的源碼我們可以發現,除了包含一個 value成員變量,其他都是

static的成員和方法,這些不會導緻性能問題。Integer類所帶來的性能問題主要來自于建立

Integer對象的開銷,例如:

  運作這段代碼,結果是

time=1,如果把 sum定義為 Long型,結果是 time=10。這提示我們除非集合和參數化類型等必要情況下,其他時候應該盡可能少使用

Integer等包裝類。

  使用 StringBuilder.append()方法和"+"對字元串進行連接配接:

  上述這段代碼,在讀第51條之前,我認為在十幾毫秒時間内可以執行完成,仍使用 System.currentTimeMillis()列印執行時間,結果是

time=4。把次數改為20000,time=16。改為100000,結果time=486。改為1000000,博文都快寫完了,還沒跑出來結果..

  看到這裡稍微有些程式設計經驗的人都大概會才出來是

Java内部使用了疊代導緻開銷呈平方級的增長,那"+"操作到底做了什麼會在内部使用疊代呢?(編譯源碼來源:CSDN-zcjl)

  我們可以看第11行,在每次進行"+"操作的時候,都會

new一個 StringBuilder對象來實作字元串的拼裝。

  這也是為什麼在拼裝操作次數未知的情況下,推薦使用

StringBuilder.append()方法的原因。