HashMap 是將 Key 作 Hash 算法,而後將 Hash 值映射到內存地址,直接取得 Key 所對應的數據。在 HashMap 中,底層數據結構使用的是數組,所謂的內存地址即數組的下標索引。HashMap 的高性能須要保證如下幾點:java
HashMap 其實是一個鏈表的數組。基於 HashMap 的鏈表方式實現機制,只要 HashCode() 和 Hash() 方法實現得足夠好,可以儘量地減小衝突的產生,那麼對 HashMap 的操做幾乎等價於對數組的隨機訪問操做,具備很好的性能。可是,若是 HashCode() 或者 Hash() 方法實現較差,在大量衝突產生的狀況下,HashMap 事實上就退化爲幾個鏈表,對 HashMap 的操做等價於遍歷鏈表,此時性能不好。算法
HashMap 的一個功能缺點是它的無序性,被存入到 HashMap 中的元素,在遍歷 HashMap 時,其輸出是無序的。若是但願元素保持輸入的順序,可使用 LinkedHashMap 替代。數組
LinkedHashMap 繼承自 HashMap,具備高效性,同時在 HashMap 的基礎上,又在內部增長了一個鏈表,用以存放元素的順序。數據結構
HashMap 經過 hash 算法能夠最快速地進行 Put() 和 Get() 操做。TreeMap 則提供了一種徹底不一樣的 Map 實現。從功能上講,TreeMap 有着比 HashMap 更爲強大的功能,它實現了 SortedMap 接口,這意味着它能夠對元素進行排序。TreeMap 的性能略微低於 HashMap。若是在開發中須要對元素進行排序,那麼使用 HashMap 便沒法實現這種功能,使用 TreeMap 的迭代輸出將會以元素順序進行。LinkedHashMap 是基於元素進入集合的順序或者被訪問的前後順序排序,TreeMap 則是基於元素的固有順序 (由 Comparator 或者 Comparable 肯定)。性能
LinkedHashMap 是根據元素增長或者訪問的前後順序進行排序,而 TreeMap 則根據元素的 Key 進行排序。測試
測試代碼:code
package mapKeySet; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; import java.util.TreeMap; /** * 2015年4月9日下午3:33:44 * @version 1.0 */ public class KeySetTest { public static void main(String[] args) { Map<String, String> map = new HashMap<String, String>(); map.put("a", "1"); map.put("b", "2"); map.put("c", "3"); map.put("d", "4"); System.out.print("HashMap:"); for(String key : map.keySet()) { System.out.print(map.get(key) + " "); } Map<String, String> linkedMap = new LinkedHashMap<String, String>(); linkedMap.put("a", "1"); linkedMap.put("b", "2"); linkedMap.put("c", "3"); linkedMap.put("d", "4"); System.out.print("LinkedHashMap:"); for(String key : linkedMap.keySet()) { System.out.print(linkedMap.get(key) + " "); } Map<String, String> treeMap = new TreeMap<String, String>(); treeMap.put("a", "1"); treeMap.put("b", "2"); treeMap.put("c", "3"); treeMap.put("d", "4"); System.out.print("TreeMap:"); for(String key : treeMap.keySet()) { System.out.print(treeMap.get(key) + " "); } } }
輸出結果爲:排序
HashMap:4 2 3 1 LinkedHashMap:1 2 3 4 TreeMap:1 2 3 4