1. 程式人生 > >JAVA中HashMap和LinkedHashMap以及TreeMap的區別

JAVA中HashMap和LinkedHashMap以及TreeMap的區別

java為資料結構中的對映定義了一個介面java.util.Map;它有四個實現類,分別是HashMap Hashtable LinkedHashMap 和 TreeMap、Map主要用於儲存健值對、根據鍵得到值、因此不允許鍵重複(重複了覆蓋了),但允許值重複

Hashmap 是一個最常用的Map,它根據鍵的HashCode 值儲存資料,根據鍵可以直接獲取它的值、具有很快的訪問速度、遍歷時、取得資料的順序是完全隨機的、HashMap最多隻允許一條記錄的鍵為Null;允許多條記錄的值為 Null;HashMap不支援執行緒的同步、即任一時刻可以有多個執行緒同時寫HashMap;可能會導致資料的不一致、如果需要同步、可以用 Collections的synchronizedMap方法使HashMap具有同步的能力、或者使用ConcurrentHashMap

Hashtable與 HashMap類似,它繼承自Dictionary類、不同的是:它不允許記錄的鍵或者值為空;它支援執行緒的同步、即任一時刻只有一個執行緒能寫Hashtable,因此也導致了 Hashtable在寫入時會比較慢

LinkedHashMap儲存了記錄的插入順序、在用Iterator遍歷LinkedHashMap時、先得到的記錄肯定是先插入的.也可以在構造時用帶引數、按照應用次數排序、在遍歷的時候會比HashMap慢、不過有種情況例外、當HashMap容量很大、實際資料較少時、遍歷起來可能會比LinkedHashMap慢、因為LinkedHashMap的遍歷速度只和實際資料有關、和容量無關、而HashMap的遍歷速度和他的容量有關

TreeMap實現SortMap介面、能夠把它儲存的記錄根據鍵排序,預設是按鍵值的升序排序、也可以指定排序的比較器、當用Iterator 遍歷TreeMap時、得到的記錄是排過序的、
一般情況下、我們用的最多的是HashMap,HashMap裡面存入的鍵值對在取出的時候是隨機的,它根據鍵的HashCode值儲存資料,根據鍵可以直接獲取它的值、具有很快的訪問速度、在Map 中插入、刪除和定位元素、HashMap 是最好的選擇
TreeMap取出來的是排序後的鍵值對、但如果您要按自然順序或自定義順序遍歷鍵、那麼TreeMap會更好
LinkedHashMap 是HashMap的一個子類、如果需要輸出的順序和輸入的相同,那麼用LinkedHashMap可以實現,它還可以按讀取順序來排列、像連線池中可以應用




以下程式碼例項可以看出HashMap,LinkedHashMap,TreeMap的區別
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.TreeMap;


public class Ceshi {
    @SuppressWarnings("unchecked")
    public static void main(String[] args) {


        //HashMapå  
        System.out.println("------HashMap無序輸出------");
        HashMap hsMap = new HashMap();
        hsMap.put("3", "Value3");
        hsMap.put("1", "Value1");
        hsMap.put("2", "Value2");
        hsMap.put("b", "ValueB");
        hsMap.put("a", "ValueA");
        Iterator it = hsMap.entrySet().iterator();
        while (it.hasNext()) {
            Map.Entry e = (Map.Entry) it.next();
            System.out.println("Key: "   e.getKey()   "--Value: "
                      e.getValue());
        }


        //TreeMap  
        System.out.println("------TreeMap按Key排序輸出------");
        TreeMap teMap = new TreeMap();
        teMap.put("3", "Value3");
        teMap.put("1", "Value1");
        teMap.put("2", "Value2");
        teMap.put("b", "ValueB");
        teMap.put("a", "ValueA");
        Iterator tit = teMap.entrySet().iterator();
        while (tit.hasNext()) {
            Map.Entry e = (Map.Entry) tit.next();
            System.out.println("Key: "   e.getKey()   "--Value: "
                      e.getValue());
        }


        //LinkedHashMap  
        System.out.println("--LinkedHashMap根據輸入的順序輸出--");
        LinkedHashMap lhsMap = new LinkedHashMap();
        lhsMap.put("3", "Value3");
        lhsMap.put("1", "Value1");
        lhsMap.put("2", "Value2");
        lhsMap.put("b", "ValueB");
        lhsMap.put("a", "ValueA");
        Iterator lit = lhsMap.entrySet().iterator();
        while (lit.hasNext()) {
            Map.Entry e = (Map.Entry) lit.next();
            System.out.println("Key: "   e.getKey()   "--Value: "
                      e.getValue());
        }
    }


}


執行結果為
------HashMap無序輸出------
Key: 3--Value: Value3
Key: 2--Value: Value2
Key: 1--Value: Value1
Key: b--Value: ValueB
Key: a--Value: ValueA


------TreeMap按Key排序輸出------
Key: 1--Value: Value1
Key: 2--Value: Value2
Key: 3--Value: Value3
Key: a--Value: ValueA
Key: b--Value: ValueB


--LinkedHashMap根據輸入的順序輸出--
Key: 3--Value: Value3
Key: 1--Value: Value1
Key: 2--Value: Value2
Key: b--Value: ValueB
Key: a--Value: ValueA