最近在學習項目優化的知識,雖然jvm優化,數據庫優化,項目架構優化這些均可以使項目的性能有必定的提升,可是若是代碼自己存在着性能問題,那麼在其餘地方怎麼優化也不會達到效果最優java
儘量使用局部變量正則表達式
儘可能減小堆變量的重複計算數據庫
for (int i = 0; i < list.size(); i++){
.......
}
我之前就這樣寫 嘻嘻嘻
複製代碼
建議替換爲:數組
int length = list.size();
for (int i = 0; i < length; i++){
............
}
複製代碼
這樣寫呢,若是在list.size()很大的時候,就會減小不少消耗安全
儘可能採用懶加載的策略,就是何時用到何時加載bash
String str = "my";
if (1 == i){
list.add(str);
}
//建議換成
if (1 == i){
String str = "my";
list.add(str);
}
複製代碼
異常不要用來控制程序流程架構
異常對性能不利,拋出異常首先要建立一個新的對象,Throwable接口的構造函數調用名爲fillInStackTrace()的本地同步方法,fillInStackTrace()方法檢查堆棧,收集調用跟蹤信息,只要有異常被拋出,Java虛擬機就必須調用堆棧,由於在處理過程當中建立了一個新的對象,異常只能用於錯誤處理,不該該用來控制程序流程jvm
不要將數組聲明爲 public static final(你有沒有這樣寫過)函數
這樣寫毫無心義,這樣只是定義了引用爲static final,數組的內容仍是能夠隨便修改的,將數組聲明爲 public 更是一個安全漏洞,這就意味着這個數組能夠被外部類所改變。性能
不要建立一些不使用的對象,不要導入不使用的類
不使用 建立導入這樣作沒有意義。當你的代碼中出現 "The value of the local variable is not used"、"The import java.util is never used",這個時候,請你刪除這些無用內容
程序運行的時候避免使用反射
反射是Java提供給用戶一個很強大的功能,功能強大每每表明着效率不高,不要在程序運行過程當中使用尤爲頻繁使用反射機制,特別是Method的invoke方法。
固然若是必須使用,儘可能在項目啓動的時候就將經過反射實例化出一個對象並放入內存。
複製代碼
使用數據庫鏈接池和線程池
這兩個池都是爲了重用對象的,前者能夠避免頻繁打開和關閉鏈接,後者能夠避免頻繁建立和銷燬線程
容器初始化時儘量指定長度
如 new ArrayList<>(10); new HashMap<>(32); 避免容器長度不足時,擴容帶來性能消耗
ArrayList 隨機遍歷快,LinkedList添加刪除快
ArrayList 數組 下標遍歷快,LinkedList 鏈表添加刪除的時候不須要位移只須要改變指向就好
複製代碼
```
Map<String,String> map = new HashMap<>();
for (Map.Entry<String,String> entry : map.entrySet()){
String key = entry.getKey();
String value = entry.getValue();
}
```
避免使用這種下邊這種,下邊遍歷兩次,上邊遍歷一次
```
Map<String,String> map = new HashMap<>();
for (String key : map.keySet()){
String value = map.get(key);
}
```
複製代碼
你手動調用這個,有可能會妨礙系統的判斷,你要相信 jvm會更知道何時該GC。
複製代碼
String儘可能少用正則表達式
正則表達式雖然功能強大,可是效率低,除非是有須要,不然儘量少用 replace() 不支持正則 replaceAll() 支持 若是是僅僅字符串的替換建議使用replace()
日誌的輸出注意級別
```
//當前的日誌級別是error
LOGGER.info("保存出錯!" + user);
```
15. 對資源的close()最好分開操做
```
try{
xxx.close();
yyy.close();
}
catch (Exception e){
.....
}
//建議改成
try{
xxx.close();
}
catch (Exception e){
....
}
try{
yyy.close();
}
catch (Exception e){
}
```
複製代碼