一.概念
數據結構:是指相互之間存在着一種或多種關係的數據元素的集合和該集合中數據元素之間的關係組成。
算法:是特定問題求解步驟的描述,算法是獨立存在的一種解決問題的方法和思想
詳細參照:http://www.cnblogs.com/xydblog/p/3565363.html其中涉及了時間複雜度和空間複雜度,只是淺顯的概念,如果想深入的瞭解請觀看研讀各種
有關書籍。還有想了解時間複雜度和空間複雜度的可以看:http://blog.csdn.net/booirror/article/details/7707551/很不錯的文章
另外本文只是概括的說明和比較幾種工具類的不同,詳細的分析接下來會有一系列的文章
二.涉及的Android中的各種數據工具
2.1常用集合類的繼承結構如下:
Collection<--List<--Vector
Collection<--List<--ArrayList
Collection<--List<--LinkedList
Collection<--Set<--HashSet
Collection<--Set<--HashSet<--LinkedHashSet
Collection<--Set<--SortedSet<--TreeSet
Map<--SortedMap<--TreeMap
Map<--HashMap (補充一個HashMap的子類LinkedHashMap:)
注意這裏的 Collection、List、Set和Map都是接口(Interface)
三.接口和類詳細介紹
3.1List下各種概念和特性
List:
List是有序的Collection,使用此接口能夠精確的控制每個元素插入的位置。用戶能夠使用索引(元素在List中的位置,類似於數組下 >標)來訪問List中的元素,
這類似於Java的數組。
Vector:
基於數組(Array)的List,ArrayList其實是對數組的動態擴充,底層的數據結構使用的是數組結構(數組長度是可變的百分之百延長);
特點:Vector是線程同步的(sychronized)的,線程安全的。速度相對ArrayList慢些。
ArrayList:
基於數組(Array)的List,ArrayList其實是對數組的動態擴充,底層的數據結構使用的是數組結構(數組長度是可變的百分之五十延長)
特點:查詢很快,但增刪較慢,線程不同步。性能上要比Vector好一些,但是線程不安全。
LinkedList:
LinkedList不同於前面兩個,基於單鏈表實現的。
它每一個節點(Node)都包含兩方面的內容:
1.節點本身的數據(data);
2.下一個節點的信息(nextNode)。
所以當對LinkedList做添加,刪除動作的時候就不用像基於數組的ArrayList一樣,必須進行大量的數據移動。
只要更改nextNode的相關信息就可以實現了,這是LinkedList的優勢。
List總結:
所有的List中只能容納單個不同類型的對象組成的表,而不是Key-Value鍵值對。例如:[ tom,1,c ]
所有的List中可以有相同的元素,例如Vector中可以有 [ tom,koo,too,koo ]
所有的List中可以有null元素,例如[ tom,null,1 ]
基於Array的List(Vector,ArrayList)適合查詢,而LinkedList 適合添加,刪除操作
3.2Set下各種概念和特性
Set:
Set是一種不包含重複的元素的無序Collection。
HashSet:
雖然Set同List都實現了Collection接口,但是他們的實現方式卻大不一樣。List基本上都是以Array爲基礎。
但是Set則是在 HashMap的基礎上來實現的,這個就是Set和List的根本區別。HashSet的存儲方式是把HashMap中的Key作爲Set的對應存儲項。
看看 HashSet的add(Object obj)方法的實現就可以一目瞭然了。
Java代碼 收藏代碼
public boolean add(Object obj) {
return map.put(obj, PRESENT) == null;
}
這個也是爲什麼在Set中不能像在List中一樣有重複的項的根本原因,因爲HashMap的key是不能有重複的。
LinkedHashSet:
HashSet的一個子類,一個鏈表。
TreeSet:
SortedSet的子類,它不同於HashSet的根本就是TreeSet是有序的。它是通過SortedMap來實現的。
Set總結:
Set實現的基礎是Map(HashMap)
Set中的元素是不能重複的,如果使用add(Object obj)方法添加已經存在的對象,則會覆蓋前面的對象
3.3Map下面的概念和特性
Map 是一種把鍵對象和值對象進行關聯的容器,而一個值對象又可以是一個Map,依次類推,這樣就可形成一個多級映射。
對於鍵對象來說,像Set一樣,一個 Map容器中的鍵對象不允許重複,這是爲了保持查找結果的一致性;如果有兩個鍵對象一樣,
那你想得到那個鍵對象所對應的值對象時就有問題了,可能你得到的並不是你想的那個值對象,結果會造成混亂,所以鍵的唯一性很重要,
也是符合集合的性質的。當然在使用過程中,某個鍵所對應的值對象可能會發生變化,這時會按照最後一次修改的值對象與鍵對應。
對於值對象則沒有唯一性的要求,你可以將任意多個鍵都映射到一個值對象上,這不會發生任何問題(不過對你的使用卻可能會造成不便,
你不知道你得到的到底是那一個鍵所對應的值對象)。
Map有兩種比較常用的實現:HashMap和TreeMap。
HashMap也用到了哈希碼的算法,以便快速查找;
LinkedHashMap繼承自HashMap,特點是內部存入數據是有順序的,增加了記住元素插入或者訪問順序的功能,這個是通過內部一個雙向的循環鏈表實現的。與 HashMap 一樣,它可以爲基本操作(add、contains 和 remove)提供穩定的性能,假定哈希函數將元素正確分佈到桶中。由於增加了維護鏈接列表的開支,其性能很可能比 HashMap 稍遜一籌,不過這一點例外:LinkedHashMap 的 collection 視圖迭代所需時間與映射的大小成比例。HashMap 迭代時間很可能開支較大,因爲它所需要的時間與其容量成比例。
TreeMap則是對鍵按序存放,因此它便有一些擴展的方法,比如firstKey(),lastKey()等,你還可以從TreeMap中指定一個範圍以取得其子Map。
鍵和值的關聯很簡單,用put(Object key,Object value)方法即可將一個鍵與一個值對象相關聯。用get(Object key)可得到與此key對象所對應的值對象。
四.各個常用類的比較
4.1幾個常用類的區別
1.ArrayList: 元素單個,效率高,多用於查詢
2.Vector: 元素單個,線程安全,多用於查詢
3.LinkedList:元素單個,多用於插入和刪除
4.HashMap: 元素成對,元素可爲空
5.HashTable: 元素成對,線程安全,元素不可爲空
6. HashSet:元素單個,元素不可重複
4.2、Vector、ArrayList和LinkedList
大多數情況下,從性能上來說ArrayList最好,但是當集合內的元素需要頻繁插入、刪除時LinkedList會有比較好的表現,
但是它們三個性能都比不上數組,另外Vector是線程同步的。所以:
如果能用數組的時候(元素類型固定,數組長度固定),請儘量使用數組來代替List;
如果沒有頻繁的刪除插入操作,又不用考慮多線程問題,優先選擇ArrayList;
如果在多線程條件下使用,可以考慮Vector;
如果需要頻繁地刪除插入,LinkedList就有了用武之地:
如果你什麼都不知道,用ArrayList沒錯。