讀《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()方法的原因。