ArrayList,Vector,HashMap,HashSet,HashTable之間的區別與聯繫

轉自:superGG

看上面的框架圖,先抓住它的主幹,即Collection和Map。

1 Collection是一個接口,是高度抽象出來的集合,它包含了集合的基本操作和屬性。

Collection包含了List和Set兩大分支。
(01) List是一個有序的隊列,每一個元素都有它的索引。第一個元素的索引值是0。
List的實現類有LinkedList, ArrayList, Vector, Stack。

(02) Set是一個不允許有重複元素的集合。
Set的實現類有HastSet和TreeSet。HashSet依賴於HashMap,它實際上是通過HashMap實現的;TreeSet依賴於TreeMap,它實際上是通過TreeMap實現的。

2 Map是一個映射接口,即key-value鍵值對。Map中的每一個元素包含“一個key”和“key對應的value”。

AbstractMap是個抽象類,它實現了Map接口中的大部分API。而HashMap,TreeMap,WeakHashMap都是繼承於AbstractMap。
Hashtable雖然繼承於Dictionary,但它實現了Map接口。


ArrayList與Vector
從總的架構如中可以看到ArrayList與Vector都實現了List接口。
List是一個有序的隊列,每一個元素都有它的索引。第一個元素的索引值是0。
List的實現類有LinkedList, ArrayList, Vector, Stack。

LinkedList 是一個繼承於AbstractSequentialList的雙向鏈表。它也可以被當作堆棧、隊列或雙端隊列進行操作。
LinkedList 實現 List 接口,能對它進行隊列操作。
LinkedList 實現 Deque 接口,即能將LinkedList當作雙端隊列使用。
LinkedList 實現了Cloneable接口,即覆蓋了函數clone(),能克隆。
LinkedList 實現java.io.Serializable接口,這意味着LinkedList支持序列化,能通過序列化去傳輸。
LinkedList 是非同步的。
****************
ArrayList 是一個數組隊列,相當於動態數組。與Java中的數組相比,它的容量能動態增長。它繼承於AbstractList,實現了List, RandomAccess, Cloneable, java.io.Serializable這些接口。
ArrayList 繼承了AbstractList,實現了List。它是一個數組隊列,提供了相關的添加、刪除、修改、遍歷等功能。
ArrayList 實現了RandmoAccess接口,即提供了隨機訪問功能。RandmoAccess是java中用來被List實現,爲List提供快速訪問功能的。在ArrayList中,我們即可以通過元素的序號快速獲取元素對象;這就是快速隨機訪問。稍後,我們會比較List的“快速隨機訪問”和“通過Iterator迭代器訪問”的效率。
ArrayList 實現了Cloneable接口,即覆蓋了函數clone(),能被克隆。
ArrayList 實現java.io.Serializable接口,這意味着ArrayList支持序列化,能通過序列化去傳輸。
******************
Vector 是矢量隊列,它是JDK1.0版本添加的類。繼承於AbstractList,實現了List, RandomAccess, Cloneable這些接口。
Vector 繼承了AbstractList,實現了List;所以,它是一個隊列,支持相關的添加、刪除、修改、遍歷等功能。
Vector 實現了RandmoAccess接口,即提供了隨機訪問功能。RandmoAccess是java中用來被List實現,爲List提供快速訪問功能的。在Vector中,我們即可以通過元素的序號快速獲取元素對象;這就是快速隨機訪問。
Vector 實現了Cloneable接口,即實現clone()函數。它能被克隆。
******************
Stack是棧。它的特性是:先進後出(FILO, First In Last Out)。
java工具包中的Stack是繼承於Vector(矢量隊列)的,由於Vector是通過數組實現的,這就意味着,Stack也是通過數組實現的,而非鏈表。當然,我們也可以將LinkedList當作棧來使用!在“Java 集合系列06之 Vector詳細介紹(源碼解析)和使用示例”中,已經詳細介紹過Vector的數據結構,這裏就不再對Stack的數據結構進行說明了。

和ArrayList不同,Vector中的操作是線程安全的。
ArrayList與Vector的區別在於:
1在擴展上,arraylist變成(150%+1),Vector變成(200%)。
2Arraylist不是線程安全的,而Vector是線程安全的;

HashMap與HashSet
1HashMap實現的是map接口,HashSet實現的是Set接口;
2HashMap存儲的是(key,value),HastSet僅僅存儲一個key,其實更準確的說是存儲一個(key,o),o是HashSet裏的一個Object型的成員變量;
HashSet的本質是一個"沒有重複元素"的集合,它是通過HashMap實現的。HashSet中含有一個"HashMap類型的成員變量"map,HashSet的操作函數,實際上都是通過map實現的。
3添加元素的時候HashMap使用的是put(key,value),HashSet使用的是add(key);

兩者都不是線程安全的。
兩者都不會有重複元素。什麼叫重複?就是相等,至於在集合類中什麼就算相等可以看看:
關於hashCode與equals

HashMap與HashTable
1HashMap是非同步的,而HashTable是同步的;
2HashMap的key與value都也有爲null,而HashTable的key,value都不能爲null;


參考資料:
http://www.cnblogs.com/wanlipeng/archive/2010/10/21/1857791.html
http://www.cnblogs.com/skywang12345/p/3308498.html


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章