java集合類是java.util 包中的重要內容。java集合框架包含了大量集合接口以及這些接口的實現類和操做他們的算法。java
java集合框架圖
主要提供的數據結構
- List
又稱有序的Collection。它按照對象的進入順序保存對象,能夠對列表中的每一個元素的出入和刪除元素位置進行精確的控制。同時,它能夠保存重複的對象。 LinkedList、ArrayList、Vector都實現了List接口。算法
- Set
Set 是數學意義上的集合。集合中元素不可重複。所以存入set的每一個元素都必須經過equals()方法來肯定對象的惟一性。 Set 接口有兩實現類,HashSet和TreeSet其中<u>TreeSet 實現了SrotedSet接口</u>因此TreeSet是有序的。數組
- Map
Map 提供一個從鍵映射到值得數據結構。它用於保存鍵值對,其中值能夠重複,可是鍵必定惟一,不能重複。Java類庫中有多個實現該接口的類:HashMap、LinkedHashMap、TreeMap、WeakHashMap、IdentityHashMap。安全
- 調用Key的hashCode()方法生成一個hash值h1。 >> + 若是這個h1在HashMap中不存在,那麼直接將<key,value>添加到HashMap中。 >> + 若是這個h1已經存在了那麼找出HashMap中全部Hash值爲h1的key。
- 分別調用equals()方法判斷當前添加的key是否與已經存在的key值相同 >> 若是相同,說明當前的Key已經存在。HashMap會使用新的value覆蓋原有的value。 >> 若是沒有相同,說明當前的Key不存在。HashMap會建立新的映射關係。
- Hash衝突的解決。(當新增的key的Hash值在HashMap中存在時,就會產生衝突。通常有開放地址法、再Hash法、鏈地址法等解決Hash衝突問題。 HashMap使用的是鏈地址法來解決衝突的
- 調用hashCode()方法獲取Key的Hash值h,肯定鍵爲Key的全部值存儲的首地址。
- 若是Key的值有多個,程序會遍歷全部結果,並經過調用key的equals()方法來判斷key的內容是否相等。只有當equals()方法的返回值爲true時,對應的value纔是正確值。
繼承的父類不一樣:HashTable繼承自Dictionary類,而HashMap繼承自Abstract Map類可是都二者實現了Map接口數據結構
線程安全性不一樣:HashTable 的方法是線程安全的,其中的每一個方法都加入了Synchronized同步。框架
提供的方法不一樣:HashMap和HashTable類似度很高,可是也有區別,在HashMap中將contain方法去掉了,改爲了containsValue和containsKey。(contains容易形成誤解)spa
key和value是否能夠爲空值(null):在HashMap中容許且只容許一個key值爲null,容許多個value值爲null。HashTable中Key和value都不容許爲null。線程
遍歷方式實現不一樣:HashTable和HashMap都是用了迭代器Iterator ^迭代器Iterator。
HashTable中還使用了Enumeration方式。3d
Hash值不一樣:HashTable直接將對象的HashCode做爲Hash值。HashMap則從新計算key的Hash值。code
數組的初始化不一樣:HashTable默認爲11,擴容爲(old*2+1),HashMap 默認爲16,擴容爲(old*2)
同步意味着,在同一時刻中只有一個線程能夠修改Hash表,任何線程在執行HashTable的更新操做前都要獲取對象鎖,其餘線程則等待線程鎖的釋放。
HashMap以使用
Map m = Collections.synchronizedMap(new HashMap());
來達到同步的效果。