當前位置:才華齋>計算機>java語言>

Java效能優化技巧大全

java語言 閱讀(2.12W)

Java效能優化技巧大全

Java效能優化技巧大全

1.儘量使用final修飾符。

帶有final修飾符的類是不可派生的。在JAVA核心API中,有許多應用final的例子,例如ng。為String類指定final防止了使用者覆蓋length()方法。另外,如果一個類是final的,則該類所有方法都是final的。java編譯器會尋找機會內聯(inline)所有的final方法(這和具體的編譯器實現有關)。此舉能夠使效能平均提高50%。

2.儘量重用物件。

特別是String物件的使用中,出現字串連線情況時應使用StringBuffer代替,由於系統不僅要花時間生成物件,以後可能還需要花時間對這些物件進行垃圾回收和處理。因此生成過多的物件將會給程式的效能帶來很大的影響。

3.儘量使用區域性變數。

呼叫方法時傳遞的引數以及在呼叫中建立的臨時變數都儲存在棧(Stack)中,速度較快。其他變數,如靜態變數,例項變數等,都在堆(Heap)中建立,速度較慢。

4.不要重複初始化變數。

預設情況下,呼叫類的建構函式時,java會把變數初始化成確定的值,所有的物件被設定成null,整數變數設定成0,float和double變數設定成0.0,邏輯值設定成false。當一個類從另一個類派生時,這一點尤其應該注意,因為用new關鍵字建立一個物件時,建構函式鏈中的所有建構函式都會被自動呼叫。

這裡有個注意,給成員變數設定初始值但需要呼叫其他方法的時候,最好放在一個方法比如initXXX()中,因為直接呼叫某方法賦值可能會因為類尚未初始化而拋空指標異常,public int state = tate();

5.在java+Oracle的應用系統開發中,java中內嵌的SQL語言應儘量使用大寫形式,以減少Oracle解析器的解析負擔。

程式設計過程中,進行資料庫連線,I/O流操作,在使用完畢後,及時關閉以釋放資源。因為對這些大物件的操作會造成系統大的開銷。

7.過分的建立物件會消耗系統的大量記憶體,嚴重時,會導致記憶體洩漏,因此,保證過期的物件的及時回收具有重要意義。

JVM的GC並非十分智慧,因此建議在物件使用完畢後,手動設定成null。

8.在使用同步機制時,應儘量使用方法同步代替程式碼塊同步。

9.儘量減少對變數的重複計算。

比如

for(int i=0;i<();i++)

應修改為

for(int i=0,len=();i<len;i++)

10.採用在需要的時候才開始建立的策略。

例如:

String str="abc";if(i==1){ (str);}

應修改為:

if(i==1){String str="abc"; (str);}

11.慎用異常,異常對效能不利。

丟擲異常首先要建立一個新的物件。Throwable介面的建構函式呼叫名為fillInStackTrace()的本地方法,fillInStackTrace()方法檢查棧,收集呼叫跟蹤資訊。只要有異常被丟擲,VM就必須調整呼叫棧,因為在處理過程中建立了一個新的物件。

異常只能用於錯誤處理,不應該用來控制程式流程。

12.不要在迴圈中使用Try/Catch語句,應把Try/Catch放在迴圈最外層。

Error是獲取系統錯誤的類,或者說是虛擬機器錯誤的類。不是所有的錯誤Exception都能獲取到的,虛擬機器報錯Exception就獲取不到,必須用Error獲取。

13.通過StringBuffer的建構函式來設定他的初始化容量,可以明顯提升效能。

StringBuffer的預設容量為16,當StringBuffer的容量達到最大容量時,她會將自身容量增加到當前的2倍+2,也就是2*n+2。無論何時,只要StringBuffer到達她的最大容量,她就不得不建立一個新的物件陣列,然後複製舊的物件陣列,這會浪費很多時間。所以給StringBuffer設定一個合理的初始化容量值,是很有必要的!

14.合理使用or。

Vector與StringBuffer類似,每次擴充套件容量時,所有現有元素都要賦值到新的儲存空間中。Vector的`預設儲存能力為10個元素,擴容加倍。

(index,obj) 這個方法可以將元素obj插入到index位置,但index以及之後的元素依次都要向下移動一個位置(將其索引加 1)。 除非必要,否則對效能不利。

同樣規則適用於remove(int index)方法,移除此向量中指定位置的元素。將所有後續元素左移(將其索引減 1)。返回此向量中移除的元素。所以刪除vector最後一個元素要比刪除第1個元素開銷低很多。刪除所有元素最好用removeAllElements()方法。

如果要刪除vector裡的一個元素可以使用 ve(obj);而不必自己檢索元素位置,再刪除,如int index = indexOf(obj);ve(index);

15.當複製大量資料時,使用ycopy();

16.程式碼重構,增加程式碼的可讀性。

17.不用new關鍵字建立物件的例項。

用new關鍵詞建立類的例項時,建構函式鏈中的所有建構函式都會被自動呼叫。但如果一個物件實現了Cloneable介面,我們可以呼叫她的clone()方法。clone()方法不會呼叫任何類建構函式。

下面是Factory模式的一個典型實現。

public static Credit getNewCredit(){ return new Credit();}改進後的程式碼使用clone()方法,private static Credit BaseCredit = new Credit();public static Credit getNewCredit(){ return (Credit)e();}

18.乘除法如果可以使用位移,應儘量使用位移,但最好加上註釋,因為位移操作不直觀,難於理解。

19.不要將陣列宣告為:public static final。

20.HaspMap的遍歷。

MapparaMap = new HashMap();for( Entryentry : ySet() ){ String appFieldDefId = ey(); String[] values = alue();}

利用雜湊值取出相應的Entry做比較得到結果,取得entry的值之後直接取key和value。

y(陣列)和ArrayList的使用。

array 陣列效率最高,但容量固定,無法動態改變,ArrayList容量可以動態增長,但犧牲了效率。

22.單執行緒應儘量使用 HashMap, ArrayList,除非必要,否則不推薦使用HashTable,Vector,她們使用了同步機制,而降低了效能。

ngBuffer,StringBuilder的區別在於:ngBuffer 執行緒安全的可變字元序列。一個類似於String的字串緩衝區,但不能修改。StringBuilder與該類相比,通常應該優先使用StringBuilder類,因為她支援所有相同的操作,但由於她不執行同步,所以速度更快。為了獲得更好的效能,在構造StringBuffer或StringBuilder時應儘量指定她的容量。當然如果不超過16個字元時就不用了。

相同情況下,使用StringBuilder比使用StringBuffer僅能獲得10%~15%的效能提升,但卻要冒多執行緒不安全的風險。綜合考慮還是建議使用StringBuffer。

24.儘量使用基本資料型別代替物件。

25.用簡單的數值計算代替複雜的函式計算,比如查表方式解決三角函式問題。

26.使用具體類比使用介面效率高,但結構彈性降低了,但現代IDE都可以解決這個問題。

27.考慮使用靜態方法

如果你沒有必要去訪問物件的外部,那麼就使你的方法成為靜態方法。她會被更快地呼叫,因為她不需要一個虛擬函式導向表。這同事也是一個很好的實踐,因為她告訴你如何區分方法的性質,呼叫這個方法不會改變物件的狀態。

28.應儘可能避免使用內在的GET,SET方法。

android程式設計中,虛方法的呼叫會產生很多代價,比例項屬性查詢的代價還要多。我們應該在外包呼叫的時候才使用get,set方法,但在內部呼叫的時候,應該直接呼叫。

29.避免列舉,浮點數的使用。

30.二維陣列比一維陣列佔用更多的記憶體空間,大概是10倍計算。

te資料庫讀取整張表的全部資料很快,但有條件的查詢就要耗時30-50MS,大家做這方面的時候要注意,儘量少用,尤其是巢狀查詢!