在JAVA程序中途乃,性能問(wèn)題的大部分原因并不在于JAVA語(yǔ)言,而是程序本身幻枉。養(yǎng)成良好的編碼習(xí)慣非常重要碰声,能夠顯著地提升程序性能。?
1. 盡量使用final修飾符展辞。?
帶有final修飾符的類是不可派生的奥邮。在JAVA核心API中,有許多應(yīng)用final的例子,例如 java.lang.String洽腺。為String類指定final防止了使用者覆蓋length()方法脚粟。另外,如果一個(gè)類是final的蘸朋,則該類所有方法都是final的核无。java編譯器會(huì)尋找機(jī)會(huì)內(nèi)聯(lián)(inline)所有的final方法(這和具體的編譯器實(shí)現(xiàn)有關(guān))。此舉能夠使性能平均提高 50%藕坯。?
2.盡量重用對(duì)象团南。?
特別是String對(duì)象的使用中,出現(xiàn)字符串連接情況時(shí)應(yīng)使用StringBuffer代替炼彪,由于系統(tǒng)不僅要花時(shí)間生成對(duì)象吐根,以后可能還需要花時(shí)間對(duì)這些對(duì)象進(jìn)行垃圾回收和處理。因此生成過(guò)多的對(duì)象將會(huì)給程序的性能帶來(lái)很大的影響辐马。?
3. 盡量使用局部變量拷橘。?
調(diào)用方法時(shí)傳遞的參數(shù)以及在調(diào)用中創(chuàng)建的臨時(shí)變量都保存在棧(Stack)中,速度較快喜爷。其他變量冗疮,如靜態(tài)變量,實(shí)例變量等檩帐,都在堆(Heap)中創(chuàng)建术幔,速度較慢。?
(大家可以一同交流:3428
? ? ? ? ? ? ? ? ? ? ? 歡迎交流36117)
4.不要重復(fù)初始化變量湃密。?
默認(rèn)情況下诅挑,調(diào)用類的構(gòu)造函數(shù)時(shí),java會(huì)把變量初始化成確定的值勾缭,所有的對(duì)象被設(shè)置成null揍障,整數(shù)變量設(shè)置成0目养,float和double變量設(shè)置成0.0俩由,邏輯值設(shè)置成false。當(dāng)一個(gè)類從另一個(gè)類派生時(shí)癌蚁,這一點(diǎn)尤其應(yīng)該注意幻梯,因?yàn)橛胣ew關(guān)鍵字創(chuàng)建一個(gè)對(duì)象時(shí),構(gòu)造函數(shù)鏈中的所有構(gòu)造函數(shù)都會(huì)被自動(dòng)調(diào)用努释。?
這里有個(gè)注意碘梢,給成員變量設(shè)置初始值但需要調(diào)用其他方法的時(shí)候,最好放在一個(gè)方法比如initXXX()中伐蒂,因?yàn)橹苯诱{(diào)用某方法賦值可能會(huì)因?yàn)轭惿形闯跏蓟鴴伩罩羔槷惓I饭琾ublic int state = this.getState();?
5.在java+Oracle的應(yīng)用系統(tǒng)開(kāi)發(fā)中,java中內(nèi)嵌的SQL語(yǔ)言應(yīng)盡量使用大寫(xiě)形式,以減少Oracle解析器的解析負(fù)擔(dān)恩沛。?
6.java編程過(guò)程中在扰,進(jìn)行數(shù)據(jù)庫(kù)連接,I/O流操作雷客,在使用完畢后芒珠,及時(shí)關(guān)閉以釋放資源。因?yàn)閷?duì)這些大對(duì)象的操作會(huì)造成系統(tǒng)大的開(kāi)銷搅裙。?
7.
過(guò)分的創(chuàng)建對(duì)象會(huì)消耗系統(tǒng)的大量?jī)?nèi)存皱卓,嚴(yán)重時(shí),會(huì)導(dǎo)致內(nèi)存泄漏部逮,因此娜汁,保證過(guò)期的對(duì)象的及時(shí)回收具有重要意義。?
JVM的GC并非十分智能兄朋,因此建議在對(duì)象使用完畢后存炮,手動(dòng)設(shè)置成null。?
8.在使用同步機(jī)制時(shí)蜈漓,應(yīng)盡量使用方法同步代替代碼塊同步穆桂。?