HashMap,LinkedHashMap和TreeMap的區別

Map主要用於存儲健值對,根據鍵獲得值,所以不容許鍵重複(重複會覆蓋),但容許值重複。安全

1. HashMap

  • Hashmap是一個最經常使用的Map,它根據鍵的HashCode值存儲數據,根據鍵能夠直接獲取它的值,具備很快的訪問速度。遍歷時,取得數據的順序是徹底隨機的;
  • HashMap最多隻容許一條記錄的鍵爲Null;容許多條記錄的值爲Null;
  • HashMap不支持線程的同步(非線程安全),即任一時刻能夠有多個線程同時寫HashMap,可能會致使數據的不一致;
  • 同步,能夠用Collections的synchronizedMap方法使HashMap具備同步的能力,或者使用ConcurrentHashMap。
  • 在Map中插入、刪除和定位元素,HashMap是最好的選擇。
  • AbstractMap抽象類,(HashMap繼承AbstractMap)覆蓋了equals()和hashCode()方法以確保兩個相等映射返回相同的哈希碼。若是兩個映射大小相等、包含一樣的鍵且每一個鍵在這兩個映射中對應的值都相同,則這兩個映射相等。數據結構

    HashMap():構建一個空的哈希映像
    HashMap(Map m):構建一個哈希映像,而且添加映像m的全部映射
    HashMap(int initialCapacity):構建一個擁有特定容量的空的哈希映像
    HashMap(int initialCapacity, float loadFactor):構建一個擁有特定容量和加載因子的空的哈希映像優化

2. HashTable

  • HashTable與HashMap相似,它不容許記錄的鍵或者值爲空;
  • 支持線程的同步(線程安全),即任一時刻只有一個線程能寫HashTable,所以致使了Hashtable在寫入時會比較慢。

3. LinkedHashMap

  • LinkedHashMap是HashMap的一個子類;
  • LinkedHashMap保存了記錄的插入順序,在用Iterator遍歷LinkedHashMap時,先獲得的記錄確定是先插入的;
  • 在遍歷的時候會比HashMap慢,不過有種狀況例外,當HashMap容量很大,實際數據較少時,遍歷起來可能會比LinkedHashMap慢,由於LinkedHashMap的遍歷速度只和實際數據有關,和容量無關,而HashMap的遍歷速度和他的容量有關。

4. TreeMap

  • TreeMap實現SortMap接口,可以把它保存的記錄根據鍵排序,默認是按鍵值的升序排序,也能夠指定排序的比較器。當用Iterator遍歷TreeMap時,獲得的記錄是排過序的。
  • TreeMap取出來的是排序後的鍵值對。但若是您要按天然順序或自定義順序遍歷鍵,那麼TreeMap會更好。
  • TreeMap基於紅黑樹實現。TreeMap沒有調優選項,由於該樹總處於平衡狀態。
  • 非線程安全線程

    TreeMap():構建一個空的映像樹
    TreeMap(Map m):構建一個映像樹,而且添加映像m中全部元素
    TreeMap(Comparator c):構建一個映像樹,而且使用特定的比較器對關鍵字進行排序
    TreeMap(SortedMap s):構建一個映像樹,添加映像樹s中全部映射,而且使用與有序映像s相同的比較器排序對象

    5. 總結及注意

  • HashSet是經過HashMap實現的,TreeSet是經過TreeMap實現的,只不過Set用的只是Map的key;
  • Map的key和Set都有一個共同的特性就是集合的惟一性。TreeMap更是多了一個排序的功能。
  • hashCode和equal(),HashMap由於無需排序因此只須要關注定位和惟一性便可。
    • hashCode是用來計算hash值的,hash值是用來肯定hash表索引的;
    • hash表中的一個索引處存放的是一張鏈表,因此還要經過equal方法循環比較鏈上的每個對象才能夠真正定位到鍵值對應的Entry;
    • put時,若是hash表中沒定位到,就在鏈表前加一個Entry;若是定位到了,則更換Entry中的value,並返回舊value。
  • 因爲TreeMap須要排序,因此須要一個Comparator爲鍵值進行大小比較。固然也是用Comparator定位的。
    • Comparator能夠在建立TreeMap時指定;
    • 若是建立時沒有肯定,那麼就會使用key.compareTo()方法,這就要求key必須實現Comparable接口;
    • TreeMap是使用Tree數據結構實現的,因此使用compare接口就能夠完成定位。
  • Collection沒有get()方法來取得某個元素,只能經過iterator()遍歷元素。
  • 通常使用ArrayList,用LinkedList構造堆棧stack、隊列queue。
  • LinkedList是由列表實現的List。對順序訪問進行了優化,向List中間插入與刪除得開銷不大,隨機訪問則相對較慢(可用ArrayList代替)。它具備方法addFirst()、addLast()、getFirst()、getLast()、removeFirst()、removeLast(),這些方法(沒有在任何接口或基類中定義過)使得LinkedList能夠看成堆棧、隊列和雙向隊列使用。
  • Map中元素,能夠將key序列、value序列單獨抽取出來。
    • 使用keySet()抽取key序列,將map中的全部keys生成一個Set。
    • 使用values()抽取value序列,將map中的全部values生成一個Collection。
相關文章
相關標籤/搜索