HashMap,LinkedHashMap,TreeMap的有序性

HashMap 是將 Key 作 Hash 算法,而後將 Hash 值映射到內存地址,直接取得 Key 所對應的數據。在 HashMap 中,底層數據結構使用的是數組,所謂的內存地址即數組的下標索引。HashMap 的高性能須要保證如下幾點:java

  1. Hash 算法必須是高效的;
  2. Hash 值到內存地址 (數組索引) 的算法是快速的;
  3. 根據內存地址 (數組索引) 能夠直接取得對應的值。

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
相關文章
相關標籤/搜索