Map主要用於存儲健值對,根據鍵獲得值,所以不容許鍵重複(重複會覆蓋),但容許值重複。安全
1. HashMap
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。