Java代碼優化的常用方法有什麽?
1. 為類、方法指定final修飾符
為類指定final修飾符可以讓類不可以被繼承,為方法指定final修飾符可以讓方法不可以被重寫,如果指定了一個類為final,則該類所有的方法都是final的,Java編譯器會尋找機會內聯所有的final方法,內聯對於提升Java運行效率作用重大,能夠使性能平均提高50%。
2. 盡量重用對象
由於Java虛擬機不僅要花時間生成對象,還需要花時間對這些對象進行垃圾回收和處理,因此,生成過多的對象將會給程序的性能帶來很大的影響。
3. 盡可能使用局部變量
調用方法時傳遞的參數以及在調用中創建的臨時變量都保存在棧中,速度較快,其他變量都在堆中創建,速度較慢,且棧中創建的變量,隨著方法的運行結束,內容就沒了,不要額外的垃圾回收。
4. 及時關閉流
Java編程過程中,進行數據庫連接、I/O流操作時務必小心,在使用完畢後,及時關閉以釋放資源,因為對這些大對象的操作會造成系統大的開銷,稍有不慎,將會導致嚴重的後果。
5. 盡量減少對變量的重復計算
在方法調用中,即使方法只有一句語句,也是有消耗的,因此,在進行方法調用時盡可以減少對變量的重復定義和引用。
6. 盡量采用懶加載的策略,即在需要的時候才創建
7. 慎用異常
異常對性能不利,因為只要有異常被拋出,Java虛擬機就必須調整調用堆棧,異常只能用於錯誤處理,不應該用來控制程序流程。
8. 不要在循環中使用try…catch…,應該把其放在最外層
9. 如果能估計到待添加的內容長度,為底層以數組方式實現的集合、工具類指定初始長度
10. 當復制大量數據時,使用System.arraycopy()命令
11. 乘法和除法使用移位操作
用移位操作可以極大地提高性能,因為在計算機底層,對位的操作是最方便、最快的。
12. 循環內不要不斷創建對象引用
13. 基於效率和類型檢查的考慮,應該盡可能使用array,無法確定數組大小時才使用ArrayList。
14. 盡量使用HashMap、ArrayList、StringBuilder,除非線程安全需要,否則不推薦使用Hashtable、Vector、StringBuffer,後三者由於使用同步機制而導致了性能開銷
15. 不要將數組聲明為public static final
因為這毫無意義,這樣只是定義了引用為static final,數組的內容還是可以隨意改變的,將數組聲明為public更是一個安全漏洞,這意味著這個數組可以被外部類所改變。
16. 盡量在合適的場合使用單例
在控制資源的使用、控制實例的產生以及控制數據的共享的場合下,可以使用單例以減輕加載的負擔、縮短加載的時間以及提高加載的效率等。
17. 盡量避免隨意使用靜態變量
18. 及時清除不再需要的會話
19. 實現RandomAccess接口的集合比如ArrayList,應當使用最普通的for循環而不是foreach循環來遍歷
20. 使用同步代碼塊替代同步方法
除非能確定一整個方法都需要進行同步,否則盡量使用同步代碼塊,避免對那些不需要進行同步的代碼也進行了同步,影響代碼執行效率。
21. 將常量聲明為static final,並以大寫命名
22. 不要創建一些不使用的對象,不要導入一些不使用的類
23. 程序運行過程中避免使用反射
反射具有強大的功能,但效率不高,不建議在程序運行過程中頻繁使用反射機制,如果確實需要使用,建議將那些需要通過反射加載的類和項目啟動的時候通過反射實例化一個對象並放入內存
24. 使用數據庫連接池和線程池
這兩個池都是用於重用對象的,前者可以避免頻繁地打開和關閉連接,後者可以避免頻繁地創建和銷毀線程。
25. 使用帶緩沖的輸入輸出流進行IO操作
26. 順序插入和隨機訪問比較多的場景使用ArrayList,元素刪除和中間插入比較多的場景使用LinkedList
27. 不要讓public方法中有太多的形參
28. 字符串變量和字符串常量equals的時候將字符串常量寫在前面
29. 在java中if (i == 1)和if (1 == i)是沒有區別的,但從閱讀習慣上講,建議使用前者
30. 不要對數組使用toString()方法
31. 不要對超出範圍的基本數據類型做向下強制轉型
32. 公用的集合類中不使用的數據一定要及時remove掉
33. 把一個基本數據類型轉為字符串,基本數據類型.toString()是最快的方式、String.valueOf(數據)次之、數據+”"最慢
34. 使用最有效率的方式去遍歷Map
35. 對資源的close()建議分開操作
36. 對於ThreadLocal使用前或者使用後一定要先remove
37. 切記以常量定義的方式替代魔鬼數字,魔鬼數字的存在將極大地降低代碼可讀性,字符串常量是否使用常量定義可以視情況而定
38. long或者Long初始賦值時,使用大寫的L而不是小寫的l,因為字母l極易與數字1混淆,這個點非常細節,值得註意
39. 所有重寫的方法必須保留@Override註解
40. 推薦使用JDK7中新引入的Objects工具類來進行對象的equals比較,直接a.equals(b),有空指針異常的風險
41. 循環體內不要使用”+”進行字符串拼接,而直接使用StringBuilder不斷append
42. 不捕獲Java類庫中定義的繼承自RuntimeException的運行時異常類
43. 避免Random實例被多線程使用,雖然共享該實例是線程安全的,但會因競爭同一seed 導致的性能下降,JDK7之後,可以使用ThreadLocalRandom來獲取隨機數
44. 靜態類、單例類、工廠類將它們的構造函數置為private
以上是常用的Java代碼優化方法,在Java代碼書寫的時候要養成代碼優化的習慣,就能夠寫出體積小、運行效率高、出錯率低的代碼!
Java代碼優化的常用方法有什麽?