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