一通用篇 通用篇
討論的問題適合於大多數Java應用
不用new關鍵詞創建類的實例
用new關鍵詞創建類的實例時
構造函數鏈中的所有構造函數都會被自動調用
但如果一個對象實現了Cloneable接口
我們可以調用它的clone()方法
clone()方法不會調用任何類構造函數
在使用設計模式(Design Pattern)的場合
如果用Factory模式創建對象
則改用clone()方法創建新的對象實例非常簡單
例如
下面是Factory模式的一個典型實現
public static Credit getNewCredit() {return new Credit();}
改進後的代碼使用clone()方法
如下所示
private static Credit BaseCredit = new Credit();public static Credit getNewCredit() {return (Credit) BaseCredit
clone();}
上面的思路對於數組處理同樣很有用
使用非阻塞I/O
版本較低的JDK不支持非阻塞I/O API
為避免I/O阻塞
一些應用采用了創建大量線程的辦法(在較好的情況下
會使用一個緩沖池)
這種技術可以在許多必須支持並發I/O流的應用中見到
如Web服務器
報價和拍賣應用等
然而
創建Java線程需要相當可觀的開銷
JDK
引入了非阻塞的I/O庫(java
nio)
如果應用要求使用版本較早的JDK
在這裡有一個支持非阻塞I/O的軟件包
慎用異常
異常對性能不利
拋出異常首先要創建一個新的對象
Throwable接口的構造函數調用名為fillInStackTrace()的本地(Native)方法
fillInStackTrace()方法檢查堆棧
收集調用跟蹤信息
只要有異常被拋出
VM就必須調整調用堆棧
因為在處理過程中創建了一個新的對象
異常只能用於錯誤處理
不應該用來控制程序流程
不要重復初始化變量
默認情況下
調用類的構造函數時
Java會把變量初始化成確定的值
所有的對象被設置成null
整數變量(byte
short
int
long)設置成
float和double變量設置成
邏輯值設置成false
當一個類從另一個類派生時
這一點尤其應該注意
因為用new關鍵詞創建一個對象時
構造函數鏈中的所有構造函數都會被自動調用
盡量指定類的final修飾符
帶有final修飾符的類是不可派生的
在Java核心API中
有許多應用final的例子
例如java
lang
String
為String類指定final防止了人們覆蓋length()方法
另外
如果指定一個類為final
則該類所有的方法都是final
Java編譯器會尋找機會內聯(inline)所有的final方法(這和具體的編譯器實現有關)
此舉能夠使性能平均提高
%
盡量使用局部變量
調用方法時傳遞的參數以及在調用中創建的臨時變量都保存在棧(Stack)中
速度較快
其他變量
如靜態變量
實例變量等
都在堆(Heap)中創建
速度較慢
另外
依賴於具體的編譯器/JVM
局部變量還可能得到進一步優化
乘法和除法
考慮下面的代碼
for (val =
; val < 100000; val +=5) { alterX = val * 8; myResult = val * 2; }
用移位操作替代乘法操作可以極大地提高性能。Tw.WIngwiT.com下面是修改後的代碼:
for (val = 0; val < 100000; val += 5) { alterX = val << 3; myResult = val << 1; }
修改後的代碼不再做乘以8的操作,而是改用等價的左移3位操作,每左移1位相當於乘以2。相應地,右移1位操作相當於除以2。值得一提的是,雖然移位操作速度快,但可能使代碼比較難於理解,所以最好加上一些注釋。
From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19756.html