
Map主要用于存儲健值對,根據(jù)鍵得到值,因此不允許鍵重復(fù)(重復(fù)會覆蓋),但允許值重復(fù)。
1. HashMap
Hashmap是一個最常用的Map,它根據(jù)鍵的HashCode值存儲數(shù)據(jù),根據(jù)鍵可以直接獲取它的值,具有很快的訪問速度。遍歷時,取得數(shù)據(jù)的順序是完全隨機的;
HashMap最多只允許一條記錄的鍵為Null;允許多條記錄的值為Null;
HashMap不支持線程的同步(非線程安全),即任一時刻可以有多個線程同時寫HashMap,可能會導(dǎo)致數(shù)據(jù)的不一致;
同步,可以用Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap。
在Map中插入、刪除和定位元素,HashMap是最好的選擇。
AbstractMap抽象類,(HashMap繼承AbstractMap)覆蓋了equals()和hashCode()方法以確保兩個相等映射返回相同的哈希碼。如果兩個映射大小相等、包含同樣的鍵且每個鍵在這兩個映射中對應(yīng)的值都相同,則這兩個映射相等。
HashMap():構(gòu)建一個空的哈希映像
HashMap(Map m):構(gòu)建一個哈希映像,并且添加映像m的所有映射
HashMap(int initialCapacity):構(gòu)建一個擁有特定容量的空的哈希映像
HashMap(int initialCapacity, float loadFactor):構(gòu)建一個擁有特定容量和加載因子的空的哈希映像
2. HashTable
HashTable與HashMap類似,它不允許記錄的鍵或者值為空;
支持線程的同步(線程安全),即任一時刻只有一個線程能寫HashTable,因此導(dǎo)致了Hashtable在寫入時會比較慢。
3. LinkedHashMap
LinkedHashMap是HashMap的一個子類;
LinkedHashMap保存了記錄的插入順序,在用Iterator遍歷LinkedHashMap時,先得到的記錄肯定是先插入的;
在遍歷的時候會比HashMap慢,不過有種情況例外,當(dāng)HashMap容量很大,實際數(shù)據(jù)較少時,遍歷起來可能會比LinkedHashMap慢,因為LinkedHashMap的遍歷速度只和實際數(shù)據(jù)有關(guān),和容量無關(guān),而HashMap的遍歷速度和他的容量有關(guān)。
4. TreeMap
TreeMap實現(xiàn)SortMap接口,能夠把它保存的記錄根據(jù)鍵排序,默認(rèn)是按鍵值的升序排序,也可以指定排序的比較器。當(dāng)用Iterator遍歷TreeMap時,得到的記錄是排過序的。
TreeMap取出來的是排序后的鍵值對。但如果您要按自然順序或自定義順序遍歷鍵,那么TreeMap會更好。
TreeMap基于紅黑樹實現(xiàn)。TreeMap沒有調(diào)優(yōu)選項,因為該樹總處于平衡狀態(tài)。
非線程安全
TreeMap():構(gòu)建一個空的映像樹
TreeMap(Map m):構(gòu)建一個映像樹,并且添加映像m中所有元素
TreeMap(Comparator c):構(gòu)建一個映像樹,并且使用特定的比較器對關(guān)鍵字進(jìn)行排序
TreeMap(SortedMap s):構(gòu)建一個映像樹,添加映像樹s中所有映射,并且使用與有序映像s相同的比較器排序
5. 總結(jié)及注意
HashSet是通過HashMap實現(xiàn)的,TreeSet是通過TreeMap實現(xiàn)的,只不過Set用的只是Map的key;
Map的key和Set都有一個共同的特性就是集合的唯一性。TreeMap更是多了一個排序的功能。
hashCode和equal(),HashMap因為無需排序所以只需要關(guān)注定位和唯一性即可。
hashCode是用來計算hash值的,hash值是用來確定hash表索引的;
hash表中的一個索引處存放的是一張鏈表,所以還要通過equal方法循環(huán)比較鏈上的每一個對象才可以真正定位到鍵值對應(yīng)的Entry;
put時,如果hash表中沒定位到,就在鏈表前加一個Entry;如果定位到了,則更換Entry中的value,并返回舊value。
由于TreeMap需要排序,所以需要一個Comparator為鍵值進(jìn)行大小比較。當(dāng)然也是用Comparator定位的。
Comparator可以在創(chuàng)建TreeMap時指定;
如果創(chuàng)建時沒有確定,那么就會使用key.compareTo()方法,這就要求key必須實現(xiàn)Comparable接口;
TreeMap是使用Tree數(shù)據(jù)結(jié)構(gòu)實現(xiàn)的,所以使用compare接口就可以完成定位。
Collection沒有g(shù)et()方法來取得某個元素,只能通過iterator()遍歷元素。
一般使用ArrayList,用LinkedList構(gòu)造堆棧stack、隊列queue。
LinkedList是由列表實現(xiàn)的List。對順序訪問進(jìn)行了優(yōu)化,向List中間插入與刪除得開銷不大,隨機訪問則相對較慢(可用ArrayList代替)。它具有方法addFirst()、addLast()、getFirst()、getLast()、removeFirst()、removeLast(),這些方法(沒有在任何接口或基類中定義過)使得LinkedList可以當(dāng)作堆棧、隊列和雙向隊列使用。
Map中元素,可以將key序列、value序列單獨抽取出來。
使用keySet()抽取key序列,將map中的所有keys生成一個Set。
使用values()抽取value序列,將map中的所有values生成一個Collection。