最近在優化代碼,把一些優化的東西整理一下記錄,個人感覺代碼優化技術含量很高,暫且把此次的問題歸爲初級優化一,後續技術學深了,再去寫一篇優化之二
避免創建不必要的對象
對象的創建都是要佔用資源的,如果你在循環程序中創建對象,由於過多的佔用內存,你將定時的啓動內容回收機制,從而降低了運行速度。所以,當你不需要時,你應該避免創建類實例。
必須使用字符串時,考慮 當字符串不可變化時,使用String類型;當可變時使用StringBuffer類型。
當需要字符串+時,使用StringBuffer。String s = “aaa” + “bbb”;
上面的語句實際上創建了三個String對象,性能受損。
StringBuffer s= new StringBuffer();
s.append(“aaa”);
s.append(“bbb”);
上面僅僅創建一個對象。
避免創建重複對象
String s= new String("abc");//永遠不要這麼幹!
Strong s = "abc";//改成這樣
多使用原始封裝的方法
當處理字符串時,應該多的使用像String.indexOf(),String.lastIndex(),以及與它們同等的方法。
避免在類內部進行Getters/Setters
據說在C++語言中,經常使用getters(eg. i=getCount())而不用局部變量的形式(i=mCount),因爲編譯器可以通過內聯進入getters。
但是在Android中,此習慣是不好的,因爲調用虛擬機的代價很高,比直接使用局部變量費時的多.所以,在公共的接口中定義getters、setters是可取的,當時,在類中,你應該直接通過局部變量來訪問。
如:
for (int i = 0; i < this.getCount(); i++)
應該寫爲:
int mCount = this.getCount();
for (int i = 0; i < mCount; i++)
多使用接口的具體實現類(Prefer virtual over interface)
當你要聲明一個HashMap對象時,你可以聲明它爲一個HashMap類,或一個Map 類:
Map myMap = new HashMap(); HashMap myMap = new HashMap();
哪一個更好的呢?
在PC機編程中,你應該更傾向與聲明爲Map,因爲你可以調用Map中提供的接口來實現更多的功能。但是在手機開發中,通過此種方法的調用,比直接調用方法多花費一倍多的時間。所以,當你用HashMap類,而且它滿足自己的需要,就不需要用聲明爲Map的方法。這個我單獨寫了個demo測試了一下,確實如此,至於根本原因還沒搞清楚,暫且先記住用法。
瞭解和使用庫
Java提供了強大而複雜的類庫,在完成某個常用功能之前,看看Java類庫中是否已經存在類似功能的類庫。一方面減少工作量,一方面使得自己的程序更加簡潔高效。例如:向量(Collection,Set,List…)中字符串的排序:Collections.sort(v);
忽略大小寫的排序:Collections.sort(v,String.CASE_INSENSITIVE_ORDER)
還有許多實用類庫,還需要平時多學習。
使用SparseArray代替HashMap<Integer,Object>
SparseArray是android裏爲<Interger,Object>這樣的HashMap而專門寫的類,目的是提高效率,其核心是折半查找函數(binarySearch)。在Android中,當我們需要定義HashMap<Integer,
E> hashMap =
new
HashMap<Integer, E>();
時,我們可以使用後面的方式來取得更好的性能。SparseArray<E>
sparseArray =
new
SparseArray<E>();
相應的也有SparseBooleanArray,用來取代HashMap<Integer, Boolean>,SparseIntArray用來取代HashMap<Integer, Integer>。
這裏就先說這些大路邊上的,代碼優化水很深啊,還需要多潛進去研究學習才能寫出高效的代碼!