Java代碼優化篇

1.儘量減少對變量的重複計算
明確一個概念,對方法的調用,即使方法中只有一句語句,也是有消耗的,包括創建棧幀、調用方法時保護現場、調用方法完畢時恢復現場等。例如下面的操作:

for (int i = 0; i < list.size(); i++){
    ...
}

建議修改爲:在list.size()很大的時候,就減少了很多的消耗

for (int i = 0, length = list.size(); i < length; i++){
    ...
}

2.儘量採用懶加載的策略(即在需要的時候才創建)
例如下面的操作:

String str = "ljz";
if (i == 1){
  list.add(str);
}

建議修改爲:

if (i == 1){
  String str = "ljz";
  list.add(str);
}

3.循環內不要不斷創建對象引用
例如下面操作:

for (int i = 1; i <= count; i++){
    Object obj = new Object();    
}

這種做法會導致內存中有count份Object對象引用存在,count很大的話,就耗費內存了,建議修改爲:

Object obj = null;
for (int i = 0; i <= count; i++){
    obj = new Object();
}

4.儘量避免隨意使用靜態變量
要知道,當某個對象被定義爲static的變量所引用,那麼GC通常是不會回收這個對象所佔有的堆內存的。
例如下面操作:

public class A{
    private static B b = new B();  
}

此時靜態變量b的生命週期與A類相同,如果A類不被卸載,那麼引用B指向的B對象會常駐內存,直到程序終止。

5.慎用異常
異常對性能不利。拋出異常首先要創建一個新的對象,Throwable接口的構造函數調用名爲fillInStackTrace()的本地同步方法,fillInStackTrace()方法檢查堆棧,收集調用跟蹤信息。只要有異常被拋出,Java虛擬機就必須調整調用堆棧,因爲在處理過程中創建了一個新的對象。異常只能用於錯誤處理,不應該用來控制程序流程。

6.儘可能使用局部變量
調用方法時傳遞的參數以及在調用中創建的臨時變量都保存在棧中,速度較快,其他變量,如靜態變量、實例變量等,都在堆中創建,速度較慢。另外,棧中創建的變量,隨着方法的運行結束,這些內容就會沒了,不需要額外的垃圾回收。

7.及時關閉流
Java編程過程中,進行數據庫連接、I/O流操作時務必小心,在使用完畢後,及時關閉以釋放資源。因爲對這些大對象的操作會造成系統大的開銷,稍有不慎,將會導致嚴重的後果。而釋放資源最好的地方就是finally代碼塊。

8.基於效率和類型檢查的考慮,應該儘可能使用array,無法確定數組大小時才使用ArrayList。

儘量使用HashMap、ArrayList、StringBuilder,除非線程安全需要,否則不推薦使用Hashtable、Vector、StringBuffer,後三者由於使用同步機制而導致了性能開銷。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章