1、儘量指定類、方法的final修飾符
2、儘量重用對象:出現字符串連接時應該使用StringBuilder/StringBuffer代替
3、儘可能使用局部變量
4、及時關閉流
5、儘量減少對變量的重複計算
for (int i = 0, length = list.size(); i < length; i++) {...}
6、儘量採用懶加載的策略,即在需要的時候才創建
7、慎用異常
8、不要在循環中使用try…catch…,應該把其放在最外層
9、如果能估計到待添加的內容長度,爲底層以數組方式實現的集合、工具類指定
初始長度
10、當複製大量數據時,使用System.arraycopy()命令
11、乘法和除法使用移位操作
for (val = 0; val < 100000; val += 5) { a = val << 3; //×8 b = val >> 1; //÷2 }
12、循環內不要不斷創建對象引用
Object obj = null;for (int i = 0; i <= count; i++) { obj = new Object(); }
13、基於效率和類型檢查的考慮,應該儘可能使用array,無法確定數組大小時才使用ArrayList,儘量使用HashMap、ArrayList、StringBuilder,除非線程安全需要,否則不推薦使用Hashtable、Vector、StringBuffer,後三者由於使用同步機制而導致了性能開銷
15、不要將數組聲明爲public static final,將數組聲明爲public更是一個安全漏洞,這意味着這個數組可以被外部類所改變
16、儘量在合適的場合使用單例,使用單例可以減輕加載的負擔、縮短加載的時間、提高加載的效率,但並不是所有地方都適用於單例,簡單來說,單例主要適用於以下三個方面:
(1)控制資源的使用,通過線程同步來控制資源的併發訪問
(2)控制實例的產生,以達到節約資源的目的
(3)控制數據的共享,在不建立直接關聯的條件下,讓多個不相關的進程或線程之間實現通信
17、儘量避免隨意使用靜態變量
18、及時清除不再需要的會話
19、實現RandomAccess接口的集合比如ArrayList,應當使用最普通的for循環而不是foreach循環來遍歷
if (list instanceof RandomAccess) { for (int i = 0; i < list.size(); i++){} }else{ Iterator<?> iterator = list.iterable(); while (iterator.hasNext()){iterator.next()} }
20、使用同步代碼塊替代同步方法
21、將常量聲明爲static final,並以大寫命名
22、不要創建一些不使用的對象,不要導入一些不使用的類
23、程序運行過程中避免使用反射
24、使用數據庫連接池和線程池
25、使用帶緩衝的輸入輸出流進行IO操作
26、順序插入和隨機訪問比較多的場景使用ArrayList,元素刪除和中間插入比較多的場景使用LinkedList
27、不要讓public方法中有太多的形參,public方法即對外提供的方法,如果給這些方法太多形參的話主要有兩點壞處:
(1)違反了面向對象的編程思想,Java講求一切都是對象,太多的形參,和麪向對象的編程思想並不契合
(2)參數太多勢必導致方法調用的出錯概率增加,至於這個”太多”指的是多少個,3、4個吧。比如我們用JDBC寫一個insertStudentInfo方法,有10個學生信息字段要插入Student表中,可以把這10個參數封裝在一個實體類中,作爲insert方法的形參。
28、字符串變量和字符串常量equals的時候將字符串常量寫在前面
29、不要對數組使用toString()方法
30、不要對超出範圍的基本數據類型做向下強制轉型
31、公用的集合類(也就是說不是方法裏面的屬性)中不使用的數據一定要及時remove掉
32、把一個基本數據類型轉爲字符串,基本數據類型.toString()是最快的方式、String.valueOf(數據)次之、數據+””最慢
33、遍歷Map的方式有很多,通常場景下我們需要的是遍歷Map中的Key和Value,那麼推薦使用的、效率最高的方式是:
HashMap<String, String> hm = new HashMap<String, String>(); hm.put("111", "222"); Set<Map.Entry<String, String>> entrySet = hm.entrySet(); Iterator<Map.Entry<String, String>> iter = entrySet.iterator(); while (iter.hasNext()) { Map.Entry<String, String> entry = iter.next(); System.out.println(entry.getKey() + "\t" + entry.getValue()); } //如果你只是想遍歷一下這個Map的key值,那用”Set keySet = hm.keySet();”會比較合適一些
34、對資源的close()建議分開操作
注意事項:
1、不用的方法加過期註解
@Deprecated
2、儘量不要使用
Byte
3、增刪改的操作必須有事務處理註解
@Transactional
4、接口->實現類,如果實現類中調用
該接口
的其他實現方法,需要使用如下方式final A service = (A) AopContext.currentProxy();
以上內容參考公衆號《我是程序汪》