1. 程式人生 > >集合類 AVA常用集合類功能、區別和效能

集合類 AVA常用集合類功能、區別和效能

Collection介面主要有兩種子類分別為List和Set,區別主要是List儲存的物件可以重複,而Set不可以重複,而Map一般為key-value這樣的對應關係,比如我們常用的HashMap。

一、List 主要有ArrayList、LinkedList、Vector和Stack

有關這些子類的效能,Android開發網從插入、刪除、移動等方面按照元素的執行效率做一一分析,通過分析Sun 的Java原始碼和實際元素操作得出下面結論:

ArrayList - 他的構造主要從AbstractList實現,主要是判斷下初始元素的容量,ArrayList最大的特點就是提供了Add、Get操作,當然可以通過迭代器來遍歷,對於元素的存在可以通過contains方法判斷。

LinkedList - 作為一種雙向連結串列結構,對於元素的插入、刪除效率比較高,只需要調整節點指向即可,但是對於隨機查詢而言效能主要看這個連結串列長度和運氣了。 LinkedList也提供了ArrayList的get方法,但是要複雜的多,主要通過next或previous方法遍歷得到。

Vector - 比較簡單和ArrayList差不多,主要是內部實現了synchronized關鍵字,實現了執行緒安全訪問但效能有些降低,同時對於元素的擴充在演算法上和ArrayList稍有不同,通過構造的容量增量係數來決定。

Stack - 作為棧的操作,本次繼承於Vector,提供了push,pop和peek方法,peek是不彈出根據資料大小獲取最後一個元素物件。

二、Set 主要有HashSet 和 TreeSet

HashSet - 該類是從Set介面繼承而來,相對於List而言就是說內部新增的元素不能重複,當然從名字的Hash來看就是通過雜湊演算法來實現防止衝突來獲得防止重複的,整體上從HashMap實現,存放元素方法的也是類似key- value的對應的,通過迭代器遍歷,不過HashSet不是執行緒安全的。

TreeSet - 這個相對於HashSet而言主要是提供了排序支援,TreeSet是從TreeMap類實現,也是非執行緒安全的。

可以看到Set的兩個類都和Map有關,下面就一起看下有關對映(Map)相關的使用。

三、Map 主要有 HashMap 和 TreeMap

HashMap - 提供了比較強大的功能實現,比如說loadFactor可以控制元素增長時記憶體分配,HashMap也是非執行緒安全的。

TreeMap - 相對於HashMap它的排序可以通過傳入包含comparator的屬性來控制。

四、單執行緒模式下效能測試 ,測試元素100~1000中平均成績 :

新增 HashMap效率最高,ArrayList最低,其他的效高的還有Stack、HashSet和Vector,較低的有LinkedList和TreeSet和TreeMap
刪除 HashMap效率最高,LinkedList最低,其他的HashSet、TreeMap和TreeSet效率較高,較低的有Vector、ArrayList和Stack
查詢 HashMap效率最高,LinkedList最低,HashXXX和TreeXXX效率都比較高,而基於List類效率耗時是Map或Set的十倍左右。

五、多執行緒模式下效能測試 ,測試元素100~1000,執行緒數10箇中平均成績 :

新增 HashSet效率最高,LinkedList最低,HashXXX和TreeXXX效率都比較高,這裡ArrayList效率較低,整體相差不大。
刪除 HashSet效率最高,LinkedList最低,整體效能同新增相似,但HashXXX或TreeXXX效能比List系列高出3倍。
查詢 仍然是HashSet效能最好,LinkedList最低,效能較差的是ArrayList,其他的均表現很好。

綜上面的單執行緒和多執行緒中的測試所述:
Android吧(ard8.com)推薦各位網友開發過程中,儘量少用LinkedList這樣的雙向連結串列,整體效率表現不是很好,而HashMap的效能比較突出綜合起來比較理想,對於ArrayList由於包含索引表,但對於隨機查詢效能很好,表現的比較中規中距。有關集合類專用的併發包concurrent版本效能 可以參考Android開發之Java併發包集合類效能分析