Map,HashMap,LinkedHashMap,TreeMap比較和理解

/*
 * 獲取功能:
 * V get(Object key):根據鍵獲取值
 * Set<K> keySet():獲取集合中全部鍵的集合
 * Collection<V> values():獲取集合中全部值的集合
 */java

Map<String, String> map = new HashMap<String, String>();

        // 建立元素並添加元素
        map.put("鄧超", "孫儷");
        map.put("黃曉明", "楊穎");
        map.put("周杰倫", "蔡依林");
        map.put("劉愷威", "楊冪");

        // V get(Object key):根據鍵獲取值
        System.out.println("get:" + map.get("周杰倫"));
        System.out.println("get:" + map.get("周杰")); // 返回null
        System.out.println("----------------------");

        // Set<K> keySet():獲取集合中全部鍵的集合
        Set<String> set = map.keySet();
        
        for (String key : set) {
            System.out.println(key);
        }
        System.out.println("----------------------");

        // Collection<V> values():獲取集合中全部值的集合
        Collection<String> con = map.values();
        for (String value : con) {
            System.out.println(value);
        }

遍歷android

// 遍歷
        // 獲取全部的鍵
        Set<String> set = map.keySet();
        // 遍歷鍵的集合,獲取獲得每個鍵
        for (String key : set) {
            // 根據鍵去找值
            String value = map.get(key);
            System.out.println(key + "---" + value);
        }

另外一種方式遍歷ide

Set<Map.Entry<String, String>> set = map.entrySet();
        // 遍歷鍵值對對象的集合,獲得每個鍵值對對象
        for (Map.Entry<String, String> me : set) {
            // 根據鍵值對對象獲取鍵和值
            String key = me.getKey();
            String value = me.getValue();
            System.out.println(key + "---" + value);
        }

當數據量大的時候,採用entrySet遍歷key+value的效率要高於keySet(比較效率https://blog.csdn.net/zhangsify/article/details/52966094)spa

//---------------------------------------------------------------------------------------------------------------------.net

/*
 * HashMap:是基於哈希表的Map接口實現。
 * 哈希表的做用是用來保證鍵的惟一性的。
 *
 * HashMap<String,String>
 * 鍵:String(不容許重複)
 * 值:String(容許重複)
 */
線程

 

HashMap<String, String> hm = new HashMap<String, String>();

        hm.put("it001", "馬雲");
        hm.put("it003", "馬化騰");
        hm.put("it004", "喬布斯");
        hm.put("it005", "張朝陽");
        hm.put("it002", "裘伯君"); // wps
        hm.put("it001", "比爾蓋茨");

        // 遍歷
        Set<String> set = hm.keySet();
        for (String key : set) {
            String value = hm.get(key);
            System.out.println(key + "---" + value);
        }

 

結果code

it004---喬布斯
it003---馬化騰
it005---張朝陽
it002---裘伯君
it001---比爾蓋茨

這裏爲何鍵it001有兩個選取最後一個 ,最後一個覆蓋前面一個鍵對象

//================================================================================blog

 

/*
 * LinkedHashMap:是Map接口的哈希表和連接列表實現,具備可預知的迭代順序。
 * 由哈希表保證鍵的惟一性
 * 由鏈表保證鍵盤的有序(存儲和取出的順序一致)
 */
排序

 

LinkedHashMap<String, String> hm = new LinkedHashMap<String, String>();

        // 建立並添加元素
        hm.put("2345", "hello");
        hm.put("1234", "world");
        hm.put("3456", "java");
        hm.put("1234", "javaee");
        hm.put("3456", "android");

        // 遍歷
        Set<String> set = hm.keySet();
        for (String key : set) {
            String value = hm.get(key);
            System.out.println(key + "---" + value);
        }

 

TreeMap

TreeMap<Student, String> tm = new TreeMap<Student, String>(
                new Comparator<Student>() {
                    @Override
                    public int compare(Student s1, Student s2) {
                        // 主要條件
                        int num = s1.getAge() - s2.getAge();
                        // 次要條件
                        int num2 = num == 0 ? s1.getName().compareTo(
                                s2.getName()) : num;
                        return num2;
                    }
                });

        // 建立學生對象
        Student s1 = new Student("潘安", 30);
        Student s2 = new Student("柳下惠", 35);
        Student s3 = new Student("唐伯虎", 33);
        Student s4 = new Student("燕青", 32);
        Student s5 = new Student("唐伯虎", 33);

        // 存儲元素
        tm.put(s1, "宋朝");
        tm.put(s2, "元朝");
        tm.put(s3, "明朝");
        tm.put(s4, "清朝");
        tm.put(s5, "漢朝");

        // 遍歷
        Set<Student> set = tm.keySet();
        for (Student key : set) {
            String value = tm.get(key);
            System.out.println(key.getName() + "---" + key.getAge() + "---"
                    + value);
        }
潘安---30---宋朝
燕青---32---清朝
唐伯虎---33---漢朝
柳下惠---35---元朝

//=========================================

HashMap

  • 它根據鍵的HashCode 值存儲數據,根據鍵能夠直接獲取它的值,具備很快的訪問速度。遍歷時,取得數據的順序是徹底隨機的(鍵惟一,取隨機)

 

  • HashMap最多隻容許一條記錄的鍵爲Null;容許多條記錄的值爲 Null(鍵可一null,值爲所謂)
  • HashMap不支持線程的同步(即任一時刻能夠有多個線程同時寫HashMap),可能會致使數據的不一致。若是須要同步,能夠用 Collections的synchronizedMap方法使HashMap具備同步的能力,或者使用ConcurrentHashMap
  • Hashtable與 HashMap相似,它繼承自Dictionary類。不一樣的是:它不容許記錄的鍵或者值爲空;它支持線程的同

LinkedHashMap

  • LinkedHashMap保存了記錄的插入順序,在用Iterator遍歷LinkedHashMap時,先獲得的記錄確定是先插入的。也能夠在構造時帶參數,按照應用次數排序。

TreeMap

  • TreeMap實現SortMap接口,可以把它保存的記錄根據鍵排序

使用方式

  • 通常狀況下,咱們用的最多的是HashMap。HashMap裏面存入的鍵值對在取出的時候是隨機的,它根據鍵的HashCode值存儲數據,根據鍵能夠直接獲取它的值,具備很快的訪問速度。在Map 中插入、刪除和定位元素,HashMap 是最好的選擇。
  • TreeMap取出來的是排序後的鍵值對。但若是您要按天然順序或自定義順序遍歷鍵,那麼TreeMap會更好。
  • LinkedHashMap 是HashMap的一個子類,若是須要輸出的順序和輸入的相同,那麼用LinkedHashMap能夠實現,它還能夠按讀取順序來排列,像鏈接池中能夠應用。
相關文章
相關標籤/搜索