HashMap是Hashtable的輕量級實現(非線程安全的實現),他們都完成了Map接口,主要區別在於HashMap容許空(null)鍵值(key),因爲非線程安全,效率上可能高於Hashtable。
HashMap容許將null做爲一個entry的key或者value,而Hashtable不容許。
HashMap把Hashtable的contains方法去掉了,改爲containsvalue和containsKey。由於contains方法容易讓人引發誤解。
Hashtable繼承自Dictionary類,而HashMap是Java1.2引進的Map interface的一個實現。
最大的不一樣是,Hashtable的方法是Synchronize的,而HashMap不是,在多個線程訪問Hashtable時,不須要本身爲它的方法實現同步,而HashMap 就必須爲之提供外同步。
Hashtable和HashMap採用的hash/rehash算法都大概同樣,因此性能不會有很大的差別。
兩句話總結:
HashMap => 不一樣步、空鍵值、效率高;
Hashtable => 同步、非空鍵值、效率略低
html
List按對象進入的順序保存對象,不作排序或編輯操做。Set對 每一個對象只接受一次,並使用本身內部的排序方法(一般,你只關心某個元素是否屬於Set,而不關心它的順序--不然應該使用List)。Map一樣對每一個 元素保存一份,但這是基於"鍵"的,Map也有內置的排序,於是不關心元素添加的順序。若是添加元素的順序對你很重要,應該使用 LinkedHashSet或者LinkedHashMap.算法
List的功能方法數組
實際上有兩種List: 一種是基本的ArrayList,其優勢在於隨機訪問元素,另外一種是更強大的LinkedList,它並非爲快速隨機訪問設計的,而是具備一套更通用的方法。安全
List : 次序是List最重要的特色:它保證維護元素特定的順序。List爲Collection添加了許多方法,使得可以向List中間插入與移除元素(這隻推 薦LinkedList使用。)一個List能夠生成ListIterator,使用它能夠從兩個方向遍歷List,也能夠從List中間插入和移除元 素。數據結構
ArrayList : 由數組實現的List。容許對元素進行快速隨機訪問,可是向List中間插入與移除元素的速度很慢。ListIterator只應該用來由後向前遍歷ArrayList,而不是用來插入和移除元素。由於那比LinkedList開銷要大不少。性能
LinkedList : 對順序訪問進行了優化,向List中間插入與刪除的開銷並不大。隨機訪問則相對較慢。(使用ArrayList代替。)還具備下列方 法:addFirst(), addLast(), getFirst(), getLast(), removeFirst() 和 removeLast(), 這些方法 (沒有在任何接口或基類中定義過)使得LinkedList能夠看成堆棧、隊列和雙向隊列使用。測試
Set的功能方法優化
Set具備與Collection徹底同樣的接口,所以沒有任何額外的功能,不像前面有兩個不一樣的List。實際上Set就是 Collection,只是行爲不一樣。(這是繼承與多態思想的典型應用:表現不一樣的行爲。)Set不保存重複的元素(至於如何判斷元素相同則較爲負責)spa
Set : 存入Set的每一個元素都必須是惟一的,由於Set不保存重複元素。加入Set的元素必須定義equals()方法以確保對象的惟一性。Set與Collection有徹底同樣的接口。Set接口不保證維護元素的次序。線程
HashSet : 爲快速查找設計的Set。存入HashSet的對象必須定義hashCode()。
TreeSet : 保存次序的Set, 底層爲樹結構。使用它能夠從Set中提取有序的序列。
LinkedHashSet : 具備HashSet的查詢速度,且內部使用鏈表維護元素的順序(插入的次序)。因而在使用迭代器遍歷Set時,結果會按元素插入的次序顯示。
Map的功能方法
方法put(Object key, Object value)添加一個「值」(想要得東西)和與「值」相關聯的「鍵」(key) (使用它來查找)。方法get(Object key)返回與給定「鍵」相關聯的「值」。能夠用containsKey()和containsValue()測試Map中是否包含某個「鍵」或「值」。 標準的Java類庫中包含了幾種不一樣的Map:HashMap, TreeMap, LinkedHashMap, WeakHashMap, IdentityHashMap。它們都有一樣的基本接口Map,可是行爲、效率、排序策略、保存對象的生命週期和斷定「鍵」等價的策略等各不相同。
執行效率是Map的一個大問題。看看get()要作哪些事,就會明白爲何在ArrayList中搜索「鍵」是至關慢的。而這正是HashMap提升速度的地方。HashMap使用了特殊的值,稱爲「散列碼」(hash code),來取代對鍵的緩慢搜索。「散列碼」是「相對惟一」用以表明對象的int值,它是經過將該對象的某些信息進行轉換而生成的。全部Java對象都能產生散列碼,由於hashCode()是定義在基類Object中的方法。
HashMap就是使用對象的hashCode()進行快速查詢的。此方法可以顯著提升性能。
Map : 維護「鍵值對」的關聯性,使你能夠經過「鍵」查找「值」
HashMap : Map基於散列表的實現。插入和查詢「鍵值對」的開銷是固定的。能夠經過構造器設置容量capacity和負載因子load factor,以調整容器的性能。
LinkedHashMap : 相似於HashMap,可是迭代遍歷它時,取得「鍵值對」的順序是其插入次序,或者是最近最少使用(LRU)的次序。只比HashMap慢一點。而在迭代訪問時發而更快,由於它使用鏈表維護內部次序。
TreeMap : 基於紅黑樹數據結構的實現。查看「鍵」或「鍵值對」時,它們會被排序(次序由Comparabel或Comparator決定)。TreeMap的特色在 於,你獲得的結果是通過排序的。TreeMap是惟一的帶有subMap()方法的Map,它能夠返回一個子樹。
WeakHashMao : 弱鍵(weak key)Map,Map中使用的對象也被容許釋放: 這是爲解決特殊問題設計的。若是沒有map以外的引用指向某個「鍵」,則此「鍵」能夠被垃圾收集器回收。
IdentifyHashMap : 使用==代替equals()對「鍵」做比較的hash map。專爲解決特殊問題而設計。