Map主要用於存儲健值對,根據鍵獲得值,所以不容許鍵重複(重複了覆蓋了),但容許值重複。html
Hashmap 是一個最經常使用的Map,它根據鍵的HashCode 值存儲數據,根據鍵能夠直接獲取它的值,具備很快的訪問速度,遍歷時,取得數據的順序是徹底隨機的。HashMap最多隻容許一條記錄的鍵爲Null;容許多條記錄的值爲 Null;數組
1. HashMap不支持線程的同步,即任一時刻能夠有多個線程同時寫HashMap;可能會致使數據的不一致。安全
若是須要同步,能夠用 Collections的synchronizedMap方法或者使用ConcurrentHashMap,調用這個對象的方法使HashMap具備同步的能力,讓你同步訪問潛在的HashMap。這麼作的結果就是當你不須要同步時,你不能切斷Hashtable中的同步(好比在一個單線程的應用程序中),並且同步增長了不少處理費用。post
2. Hashtable與 HashMap相似,它繼承自陳舊的Dictionary類,不一樣的是:它不容許記錄的鍵或者值爲空;它支持線程的同步,即任一時刻只有一個線程能寫Hashtable,所以也致使了 Hashtable在寫入時會比較慢。性能
3. LinkedHashMap保存了記錄的插入順序,在用Iterator遍歷LinkedHashMap時,先獲得的記錄確定是先插入的, 也能夠在構造時用帶參數,按照應用次數排序。優化
在遍歷的時候會比HashMap慢,不過有種狀況例外,當HashMap容量很大,實際數據較少時,遍歷起來可能會比LinkedHashMap慢,由於LinkedHashMap的遍歷速度只和實際數據有關,和容量無關,而HashMap的遍歷速度和他的容量有關。spa
4. TreeMap實現SortMap接口,可以把它保存的記錄根據鍵排序,默認是按鍵值的升序排序,也能夠指定排序的比較器,當用Iterator 遍歷TreeMap時,獲得的記錄是排過序的。線程
通常狀況下,咱們用的最多的是HashMap,HashMap裏面存入的鍵值對在取出的時候是隨機的,它根據鍵的HashCode值存儲數據,根據鍵能夠直接獲取它的值,具備很快的訪問速度。在Map 中插入、刪除和定位元素,HashMap 是最好的選擇。code
TreeMap取出來的是排序後的鍵值對。但若是您要按天然順序或自定義順序遍歷鍵,那麼TreeMap會更好。htm
LinkedHashMap 是HashMap的一個子類,若是須要輸出的順序和輸入的相同,那麼用LinkedHashMap能夠實現,它還能夠按讀取順序來排列,像鏈接池中能夠應用。
HashSet 、HashMap 、LinkedHashMap區別:
hashset : 是類,實現set接口,根據成員對象在堆內存中地址算hash值
hashmap : 是類,實現map接口,根據鍵值計算hashcode的值,容許一個key爲null,能夠用Collections.synchorizedMap(map)來得到線程安全的map,是fail-fast迭代器
hashtable : 是類,還實現陳舊的Directory接口,線程安全的,鍵和值都不容許爲null(currentHashMap是對hashtable的優化),不是fail-fast迭代器;可是不能切斷Hashtable中的同步,因此對於單線程來講hashtable會影響性能;
Hashtable.Synchroized只能保證單個的寫操做是安全的,對分開的兩次操做不能提供安全。
ConcurrentHashMap: 是類,拓展了Hashtable,底層採用分段的數組+鏈表實現,線程安全,使用了鎖分離技術,段內擴容,ConcurrentHashMap對分開兩次操做也是安全的
linkedhashmap:是類,實現map接口,根據鍵值計算hashcode的值,有序的(默認按插入的順序, 也能夠在構造時用帶參數,按照應用次數排序,若是須要輸出的順序和輸入的相同,那麼用LinkedHashMap能夠實現)
關於HashMap和HashTable的小建議:
一些資料建議,當須要同步時,用Hashtable,反之用HashMap。可是,由於在須要時,HashMap能夠被同步,HashMap的功能比Hashtable的功能更多,並且它不是基於一個陳舊的類的,因此有人認爲,在各類狀況下,HashMap都優先於Hashtable。
1. HashSet是經過HashMap實現的,TreeSet是經過TreeMap實現的,只不過Set用的只是Map的key
2. hashCode和equal()是HashMap用的, 由於無需排序因此只須要關注定位和惟一性便可.
a. hashCode是用來計算hash值的,hash值是用來肯定hash表(hash表也是數組)索引的.
b.若是造成了鏈表, hash表中的一個索引處就會存放一張鏈表, 因此還要經過equal方法循環比較鏈上的每個對象才能夠真正定位到鍵值對應的Entry.
c. put時,若是hash表中沒定位到,就在鏈表前加一個Entry,若是定位到了,則更換Entry中的value,並返回舊value
注意:
一、 HashMap會利用對象的hashCode來快速找到key。 哈希碼就是將對象的key信息通過一些轉變造成惟一的int值(也就是hash標的索引),而後存儲在一個array中。由於咱們都知道全部存儲結構中,array查找速度是最快的。因此,能夠加速查找。發生碰撞時,讓array指向多個values。即,數組每一個位置上又生成一個槤表。
二、Map中元素,能夠將key序列、value序列單獨抽取出來。由於key老是獨一無二的而value容許重複,因此使用keySet()抽取key序列,將map中的全部keys生成一個Set。 使用values()抽取value序列,將map中的全部values生成一個Collection。