從 Java 1.5 開始,新增了自動裝箱(autoboxing)的功能,這一定程度上模糊了基本類型與裝箱基本類型的區別,有些人會很隨意地將兩者進行混用,這樣代碼在編譯及運行時雖不報錯,但在性能上卻有着不小的差別,看下面的例子:
long startTime = System.currentTimeMillis();
Long sum = 0L;
for (long i = 0; i < 100000000; i++) {
sum += i;
}
System.out.println("計算結果: sum = " + sum);
System.out.println("共耗時 " + (System.currentTimeMillis() - startTime) + " 毫秒!");
上面的代碼累加了從 0 到 100000000 的和,將和存放在 Long 類型的變量 sum 中,並記錄代碼運行時間,以下是在我機器上的執行結果:
計算結果: sum = 4999999950000000
共耗時 470 毫秒!
現在將其中的 sum 改爲 long 類型,修改後代碼如下:
long startTime = System.currentTimeMillis();
long sum = 0L;
for (long i = 0; i < 100000000; i++) {
sum += i;
}
System.out.println("計算結果: sum = " + sum);
System.out.println("共耗時 " + (System.currentTimeMillis() - startTime) + " 毫秒!");
運行結果
計算結果: sum = 4999999950000000
共耗時 33 毫秒!
可以看到,修改後的代碼運行耗時不及修改之前的十分之一。
原因
修改之前 sum 爲 Long 類型,那麼在每次執行 sum += i 的時候,由於自動裝箱,每次都會新創建一個 Long 類型的示例,在 for 循環期間,相當於新建了 100000000 個 Long 類型的對象,把 sum 改爲 long 可以避免出現新建 Long 實例,從而縮短程序執行所需小號的時間。
結論
優先使用基本類型而不是裝箱基本類型,避免創建不必要的對象。