天天看點

全面解析Java語言 Java技能優化集錦

通用篇 

     “通用篇”讨論的問題适合于大多數Java應用。

  <b>不用new關鍵詞建立類的執行個體</b>

  用new關鍵詞建立類的執行個體時,構造函數鍊中的所有構造函數都會被自動調用。但如果一個對象實作了Cloneable接口,我們可以調用它的clone()方法。clone()方法不會調用任何類構造函數。

  在使用設計模式(Design Pattern)的場合,如果用Factory模式建立對象,則改用clone()方法建立新的對象執行個體非常簡單。例如,下面是Factory模式的一個典型實作:

public static Credit getNewCredit() {

return new Credit();

}

改進後的代碼使用clone()方法,如下所示:

private static Credit BaseCredit = new Credit();

return (Credit) BaseCredit.clone();

  上面的思路對于數組處理同樣很有用。

  <b>使用非阻塞I/O</b>

  JDK 1.4引入了非阻塞的I/O庫(java.nio)。如果應用要求使用版本較早的JDK,在這裡有一個支援非阻塞I/O的軟體包。

  請參見Sun中國網站的《調整Java的I/O性能》。

    <b>慎用異常</b>

  異常對性能不利。抛出異常首先要建立一個新的對象。Throwable接口的構造函數調用名為fillInStackTrace()的本地(Native)方法,fillInStackTrace()方法檢查堆棧,收集調用跟蹤資訊。隻要有異常被抛出,VM就必須調整調用堆棧,因為在處理過程中建立了一個新的對象。

  異常隻能用于錯誤處理,不應該用來控制程式流程。

   <b> 不要重複初始化變量</b>

  預設情況下,調用類的構造函數時, Java會把變量初始化成确定的值:所有的對象被設定成null,整數變量(byte、short、int、long)設定成0,float和 double變量設定成0.0,邏輯值設定成false。當一個類從另一個類派生時,這一點尤其應該注意,因為用new關鍵詞建立一個對象時,構造函數鍊中的所有構造函數都會被自動調用。

  <b>盡量指定類的final修飾符</b>

  帶有final修飾符的類是不可派生的。在Java核心API中,有許多應用final的例子,例如java.lang.String。為String類指定final防止了人們覆寫length()方法。

  另外,如果指定一個類為final,則該類所有的方法都是final。Java編譯器會尋找機會内聯(inline)所有的final方法(這和具體的編譯器實作有關)。此舉能夠使性能平均提高50%。

  <b>盡量使用局部變量</b>

  調用方法時傳遞的參數以及在調用中建立的臨時變量都儲存在棧(Stack)中,速度較快。其他變量,如靜态變量、執行個體變量等,都在堆(Heap)中建立,速度較慢。另外,依賴于具體的編譯器/JVM,局部變量還可能得到進一步優化。請參見《盡可能使用堆棧變量》。

  <b>乘法和除法</b>

  考慮下面的代碼:

for (val = 0; val &lt; 100000; val +=5) { alterX = val * 8; myResult = val * 2; }

   用移位操作替代乘法操作可以極大地提高性能。下面是修改後的代碼:

 for (val = 0; val &lt; 100000; val += 5) { alterX = val &lt;&lt; 3; myResult = val &lt;&lt; 1; }

   修改後的代碼不再做乘以8的操作,而是改用等價的左移3位操作,每左移1位相當于乘以2。相應地,右移1位操作相當于除以2。值得一提的是,雖然移位操作速度快,但可能使代碼比較難于了解,是以最好加上一些注釋。

本文轉自 wws5201985 51CTO部落格,原文連結:http://blog.51cto.com/wws5201985/735591,如需轉載請自行聯系原作者