Java代碼優化是Java編程開發很重要的一個步驟,Java代碼優化要注重細節優化,一個兩個的細節的優化,產生的效果不大,可是若是到處都能注意代碼優化,對代碼減小體積、提升代碼運行效率是有巨大幫助的,還能在必定程度上避免未知錯誤,經常使用的Java代碼優化細節以下:java
1. 爲類、方法指定final修飾符數據庫
爲類指定final修飾符可讓類不能夠被繼承,爲方法指定final修飾符可讓方法不能夠被重寫,若是指定了一個類爲final,則該類全部的方法都是final的,Java編譯器會尋找機會內聯全部的final方法,內聯對於提高Java運行效率做用重大,可以使性能平均提升50%。編程
2. 儘可能重用對象數組
因爲Java虛擬機不只要花時間生成對象,還須要花時間對這些對象進行垃圾回收和處理,所以,生成過多的對象將會給程序的性能帶來很大的影響。安全
3. 儘量使用局部變量多線程
調用方法時傳遞的參數以及在調用中建立的臨時變量都保存在棧中,速度較快,其餘變量都在堆中建立,速度較慢,且棧中建立的變量,隨着方法的運行結束,內容就沒了,不要額外的垃圾回收。app
4. 及時關閉流dom
Java編程過程當中,進行數據庫鏈接、I/O流操做時務必當心,在使用完畢後,及時關閉以釋放資源,由於對這些大對象的操做會形成系統大的開銷,稍有不慎,將會致使嚴重的後果。ide
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代碼書寫的時候要養成代碼優化的習慣,就可以寫出體積小、運行效率高、出錯率低的代碼!