2019/3/2 18:18:55
一、通用(yòng)篇
“通用(yòng)篇”討(tǎo)論的(de)問題适合于大(dà)多數Java應用(yòng)。
1.1 不用(yòng)new關鍵詞創建類的(de)實例
用(yòng)new關鍵詞創建類的(de)實例時,構造函數鏈中的(de)所有(yǒu)構造函數都(dōu)會(huì)被自動調用(yòng)。但(dàn)如(rú)果一個(gè)對象實現了Cloneable接口,我們可(kě)以調用(yòng)它的(de)clone()方法。clone()方法不會(huì)調用(yòng)任何類構造函數。
在使用(yòng)設計(jì)模式(Design Pattern)的(de)場(chǎng)合,如(rú)果用(yòng)Factory模式創建對象,則改用(yòng)clone()方法創建新的(de)對象實例非常簡單。例如(rú),下面是Factory模式的(de)一個(gè)典型實現:
public static Credit getNewCredit() {
return new Credit();
}
改進後的(de)代碼使用(yòng)clone()方法,如(rú)下所示:
private static Credit BaseCredit = new Credit();
public static Credit getNewCredit() {
return (Credit) BaseCredit.clone();
}
上(shàng)面的(de)思路(lù)對于數組處理(lǐ)同樣很有(yǒu)用(yòng)。
1.2 使用(yòng)非阻塞I/O
版本較低的(de)JDK不支持非阻塞I/O API。爲避免I/O阻塞,一些應用(yòng)采用(yòng)了創建大(dà)量線程的(de)辦法(在較好的(de)情況下,會(huì)使用(yòng)一個(gè)緩沖池)。這種技術(shù)可(kě)以在許多必須支持并發I/O流的(de)應用(yòng)中見到(dào),如(rú)Web服務器(qì)、報價和(hé)拍(pāi)賣應用(yòng)等。然而,創建Java線程需要相(xiàng)當可(kě)觀的(de)開(kāi)銷。
JDK 1.4引入了非阻塞的(de)I/O庫(java.nio)。如(rú)果應用(yòng)要求使用(yòng)版本較早的(de)JDK,在這裏有(yǒu)一個(gè)支持非阻塞I/O的(de)軟件(jiàn)包。
請參見Sun中國網站的(de)《調整Java的(de)I/O性能(néng)》。
1.3 慎用(yòng)異常
異常對性能(néng)不利。抛出異常首先要創建一個(gè)新的(de)對象。Throwable接口的(de)構造函數調用(yòng)名爲fillInStackTrace()的(de)本地(dì)(Native)方法,fillInStackTrace()方法檢查堆棧,收集調用(yòng)跟蹤信息。隻要有(yǒu)異常被抛出,VM就必須調整調用(yòng)堆棧,因爲在處理(lǐ)過程中創建了一個(gè)新的(de)對象。
異常隻能(néng)用(yòng)于錯誤處理(lǐ),不應該用(yòng)來控制(zhì)程序流程。
1.4 不要重複初始化變量
默認情況下,調用(yòng)類的(de)構造函數時, Java會(huì)把變量初始化成确定的(de)值:所有(yǒu)的(de)對象被設置成null,整數變量(byte、short、int、long)設置成0,float和(hé) double變量設置成0.0,邏輯值設置成false。當一個(gè)類從另一個(gè)類派生時,這一點尤其應該注意,因爲用(yòng)new關鍵詞創建一個(gè)對象時,構造函數鏈中的(de)所有(yǒu)構造函數都(dōu)會(huì)被自動調用(yòng)。
1.5 盡量指定類的(de)final修飾符
帶有(yǒu)final修飾符的(de)類是不可(kě)派生的(de)。在Java核心API中,有(yǒu)許多應用(yòng)final的(de)例子,例如(rú)java.lang.String。爲String類指定final防止了人(rén)們覆蓋length()方法。
另外,如(rú)果指定一個(gè)類爲final,則該類所有(yǒu)的(de)方法都(dōu)是final。Java編譯器(qì)會(huì)尋找機會(huì)内聯(inline)所有(yǒu)的(de)final方法(這和(hé)具體的(de)編譯器(qì)實現有(yǒu)關)。此舉能(néng)夠使性能(néng)平均提高(gāo)50%。
1.6 盡量使用(yòng)局部變量
調用(yòng)方法時傳遞的(de)參數以及在調用(yòng)中創建的(de)臨時變量都(dōu)保存在棧(Stack)中,速度較快。其他(tā)變量,如(rú)靜态變量、實例變量等,都(dōu)在堆(Heap)中創建,速度較慢(màn)。另外,依賴于具體的(de)編譯器(qì)/JVM,局部變量還可(kě)能(néng)得到(dào)進一步優化。請參見《盡可(kě)能(néng)使用(yòng)堆棧變量》。
1.7 乘法和(hé)除法
考慮下面的(de)代碼:
for (val = 0; val < 100000; val +=5) { alterX = val * 8; myResult = val * 2; }
用(yòng)移位操作替代乘法操作可(kě)以極大(dà)地(dì)提高(gāo)性能(néng)。下面是修改後的(de)代碼:
for (val = 0; val < 100000; val += 5) { alterX = val << 3; myResult = val << 1; }
修改後的(de)代碼不再做乘以8的(de)操作,而是改用(yòng)等價的(de)左移3位操作,每左移1位相(xiàng)當于乘以2。相(xiàng)應地(dì),右移1位操作相(xiàng)當于除以2。值得一提的(de)是,雖然移位操作速度快,但(dàn)可(kě)能(néng)使代碼比較難于理(lǐ)解,所以最好加上(shàng)一些注釋。
深圳市南山區南山街(jiē)道南海(hǎi)大(dà)道西(xī)桂廟路(lù)北陽光(guāng)華藝大(dà)廈1棟4F、4G-04
咨詢電話(huà):136 8237 6272
大(dà)客戶咨詢:139 0290 5075
業(yè)務QQ:195006118
技術(shù)QQ:179981967