Java----代碼最佳化篇,java----代碼
一、咱們之所以這麼乾的目的:
1.效率(最重要)
2.可讀性,便於後期維護。(同樣很重要)
二、代碼最佳化的要求:
1.減小代碼的體積。
2.提高代碼的運行效率。
三、常用的代碼的最佳化:
1、盡量重用對象 :
特別是String對象的重用。最常用的就是字串的拼接:
當遇到頻繁擦拼接String時。記住一定用StringBuilder/StringBuffer
例如:
1 ArrayList<String> list;2 //省去list初始化。3 StringBuilder builder = new StringBuilder();4 5 for (String s : list) {6 builder.append(s);7 }8 String result = builder.toString();
原因:Java虛擬機器不僅要花時間產生對象,而且還要花時間處理和回收對象,產生過多個物件必定會給程式效能帶來影響。
2. 儘可能使用局部變數 :
局部變數在棧中建立,建立速度快,用完即自動消失,不需要額外的記憶體回收。
而靜態變數、執行個體變數等在堆中建立,建立速度慢,同時還依賴Java記憶體回收機制處理。
3. 及時關閉流 :
Java程式開發中,在對I/O,資料庫操作結束後,一定要記住關閉流。
原因:未關閉流會對系統造成很大的開銷,甚至會對資料造成嚴重的後果。
4. 使用懶載入
懶載入 : 當要用的時候才建立該對象。
例如:
1 String prefix = "gebi";2 3 if ("laowang".equals(name)) {4 list.add(prefix + name);5 }
替換為:
1 if("laowang".equals(name)) {2 String prefix = "gebi";3 list.add(prefix + name);4 }
5.避免在迴圈中使用try...catch,在迴圈外層使用try...catch
6.try...catch不宜太大。
不要將無用代碼,即不會拋出異常的代碼統統放入try...catch塊中,減小try...catch代碼塊的大小。
保證代碼的可讀性,易維護性,健壯性。
7.迴圈內盡量避免建立對象的引用。
尤其是迴圈量大的時候。
1 while (i<1000) {2 Object object = new Object();3 }
建議修改為:
1 Object object = null;2 3 while (i<1000) {4 object = new Object();
每次new Object()的時候,Object對象引用指向Object對象。
當迴圈次數多的時候,如第一種,JVM會建立1000個對象的引用,而第二種記憶體中只有一份Object對象引用。這樣就大大節省了記憶體空間了。
8.不要隨意使用static變數。
當對象被聲明為static的變數所引用時,此時,Java記憶體回收行程不會清理這個對象所佔用的堆記憶體。
靜態變數所佔用的堆記憶體直到該變數所在類所在程式結束才被釋放。 即靜態變數生命週期=類生命週期。
9.不要建立一些不使用的對象,不要匯入一些不使用的類。
10.使用帶緩衝的I/O流:
帶緩衝的I/O流可以極大提高I/O效率。BufferedWriter, BufferedReader, BufferedInputStream, BufferedOutputStream。
11.封裝類資料轉換為字串使用: toString
Integer i = 1;
封裝類資料轉換為字串方法速度排名 :
i.toString > String.valueOf(i) > "" + i
12.Map遍曆效率 : entrySet > keySet
1 //entrySet() 2 for (Entry<String, String> entry : map.entrySet()) { 3 String key = entry.getKey(); 4 String value = entry.getValue(); 5 System.out.println(key + " : " + value); 6 } 7 8 //上下對比 9 10 //keySet()11 for (String key : map.keySet()) {12 String value = map.get(key);13 System.out.println(key + " : " + value);14 }
13.關於Iterator與forEach()的集合遍曆舍取。
演算法導論上說:演算法是為了提高空間效率和時間效率。但往往時間和空間不能並存。
時間效率:Iterator > forEach()
代碼可讀性 : forEach() > Iterator
1 //Iterator 2 Set<Entry<String, String>> entrySet = map.entrySet(); 3 Iterator<Entry<String, String>> iter = entrySet.iterator(); 4 5 while (iter.hasNext()) { 6 Entry<String, String> entry = iter.next(); 7 String key = entry.getKey(); 8 String value = entry.getValue(); 9 System.out.println(key + " : " + value);10 }
對比:
1 //forEach()2 for (Entry<String, String> entry : map.entrySet()) {3 String key = entry.getKey();4 String value = entry.getValue();5 System.out.println(key + " : " + value);6 }
個人認為:當處理大資料時推薦使用Iterator遍曆集合。
但處理小資料的話,為了可讀性和後期維護還是使用forEach()。
兩者結合使用,都應該掌握。