創建對象:
1.避免在循環體中創建對象,循環前應該創建對象,避免浪費更多內存空間和增加GC負擔
這種情況在我們的實際應用中經常遇到,而且我們很容易犯類似的錯誤,例如下面的代碼:
for (int i = 0; i < 10000; i ++) {
Object obj = new Object(); //每次都在棧中創建了對象引用obj
System.out.println("obj= "+ obj);
}
上面代碼的書寫方式相信對你來說不會陌生,也許在以前的應用開發中你也這樣做過,尤其是在枚舉一個Vector對象中的對象元素的操作中經常會這樣書寫,但這卻違反了上述規則,因為這樣會浪費較大的內存空間,正確的方法如下所示:
Object obj = null; //在循環外創建對象引用,只是在棧中創建了一個對象引用obj
for (int i = 0; i < 10000; ++i) {
obj = new Object();
System.out.println("obj= "+ obj);
}
采用上面的第二種編寫方式,僅在內存中保存一份對該對象的引用,而不像上面的第一種編寫方式中代碼會在內存中產生大量的對象應用,浪費大量的內存空間,而且增大了系統做垃圾回收的負荷。因此在循環體中聲明創建對象的編寫方式應該盡量避免。
2.數據格式化首選操作符格式化,即‘+’號,次選其他方法MessageFormat
3.盡量用對象的valueOf轉換對象。eg:BigDecimal.valueOf(12.00);
類和接口:
1.復合優於繼承(指extends)
繼承(extends)中,構造方法中決不能調用可被覆蓋的方法(@override);clone和readObject也不可以調用可覆蓋方法
2.接口優於抽象類
3.盡量不要用接口定義常量,常量可用工具類或枚類型
其他:
1.集合都定義泛型,優先使用for循環
異常:(少用異常)
受檢異常:exception 調用者希望有適當的恢復機制,就用受檢異常
未受檢異常:RuntimeException or ERROR 不必聲明
失敗原子性:失敗的方法調用應該使對象保持在調用之前的狀態
實現方法:1.設計不可變對象 2.執行操作前檢查參數有效性或調整計算的處理過程(先處理不發生狀態變化的邏輯)
3.提供恢復代碼4.在對象的臨時拷貝上執行操作
性能相關:
1.盡量產生少的對象
a.如果一個對象能重復使用,可以不用每次都new
2.盡量產生少的函數調用
a.inline
b.在new 一個帶多個屬性的對象時候,盡量采用構造初始化函數,少用set形式
3.循環處理
a.不用try{}catch{}
b.使用for
c.原則1
4.區別處理基本類型類和包裝類型類
基本類型數據產生和處理在棧中,包裝類型是對象,會在堆中產生實例,JVM對包裝類處理首先會調用valeOf得到實際值,再做其他操作
a.適用包裝類型的場合:集合類對象,有對象方面需求時候
b.其他提倡使用基本類型
5.避免產生JVM無法馬上回收的無用的引用的對象
比如數組或其他集合中某些個對象無用了,要手工釋放對象:obj =null;
6.字符串處理
拼接:StringBuildder(JKD1.5)、StringBuffer
7.數組拷貝
System.arrayCopy 是native調用
8.多線程
a.盡量避免使用多線程
b.synchronized func(){} 比 func(){synchronized(this){}} 上高效,前提 后一種鎖的代碼片段比較少
9.系統間調用
a.遠程調用盡量減少遠程調用的次數,比方使用粗粒度傳輸對象
b.同一系統(進程)間調用內使用本地接口,不要用遠程
c.webService適用公開對外發布接口,針對不同平台系統,同一平台間調用盡量不要用。
比方都是java平台,可以用hessian協議