JAVA Map的詳細學習

前言:
**Java 自帶了各種 Map 類。這些 Map 類可歸爲三種類型:

  1. 通用Map,用於在應用程序中管理映射,通常在 java.util 程序包中實現
    HashMap、Hashtable、Properties、LinkedHashMap、IdentityHashMap、TreeMap、WeakHashMap、ConcurrentHashMap
  2. 專用Map,通常我們不必親自創建此類Map,而是通過某些其他類對其進行訪問
    java.util.jar.Attributes、javax.print.attribute.standard.PrinterStateReasons、java.security.Provider、java.awt.RenderingHints、javax.swing.UIDefaults
  3. 一個用於幫助我們實現自己的Map類的抽象類
    AbstractMap**

HashMap的遍歷

    public static void main(String[] args) {
        HashMap<String,Integer> map  = new HashMap<>();
        map.put("zdj",1);
        map.put("zdk",2);
        Iterator<String> it = map.keySet().iterator();
        while(it.hasNext()){
            String key = it.next();
            System.out.println(key + map.get(key));
        }

        System.out.println("---------------------");
        Iterator<Map.Entry<String,Integer>>it2 = map.entrySet().iterator();
        while(it2.hasNext()){
            Map.Entry<String,Integer>entry = it2.next();
            System.out.println(entry.getKey()+" "+entry.getValue());
        }
        System.out.println("---------------------");
        for(Map.Entry<String,Integer> entry: map.entrySet()){
            System.out.println(entry.getKey()+" "+entry.getValue());
        }
        System.out.println("---------------------");
        for(String key : map.keySet())
            System.out.println(key);
        }

總結:
主要分爲for each 循環遍歷 和迭代器遍歷這兩種遍歷裏面有keySet 迭代和entrySet迭代兩種
迭代器遍歷效率比較高,entrySet遍歷效率高,迭代器的遍歷速度要比增強for循環快很多,是增強for循環的2倍左右。使用entrySet遍歷的速度要比keySet快很多,是keySet的1.5倍左右。

排序

HashMap是無法排序,只能用自己的map.entryset傳給list用ArrayList實現排序,
TreeMap是可以通過重寫比較器方法,自身按key值排序,不能按value排序,TreeMap底層是根據紅黑樹的數據結構構建的,默認是根據key的自然排序來組織(比如integer的大小,String的字典排序)。所以,TreeMap只能根據key來排序,是不能根據value來排序的(否則key來排序根本就不能形成TreeMap)。
如果非要按值排序就得利用ArrayList接一下,重新排序,

HashMap 按key排序:

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

        map.put("b",1);
        map.put("a",4);
        map.put("d",3);
        map.put("c",2);
        List<Map.Entry<String,Integer>>list = new ArrayList<Map.Entry<String, Integer>>(map.entrySet());
        Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() {
            @Override
            public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
                return o1.getKey().compareTo(o2.getKey());
            }
        });
        for(Map.Entry<String,Integer> entry :list) System.out.println(entry.getKey()+" "+entry.getValue());
a 4
b 1
c 2
d 3

Process finished with exit code 0

HashMap 按value排序:

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

        map.put("a",1);
        map.put("b",4);
        map.put("c",3);
        map.put("d",2);
        List<Map.Entry<String,Integer>>list = new ArrayList<Map.Entry<String, Integer>>(map.entrySet());
        Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() {
            @Override
            public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
                return o1.getKey().compareTo(o2.getKey());
            }
        });
        for(Map.Entry<String,Integer> entry :list) System.out.println(entry.getKey()+" "+entry.getValue());
b 1
c 2
d 3
a 4

Process finished with exit code 0

TreeMap 按key排序*(自身排序)


        Map<String,Integer>map = new TreeMap<String,Integer>(new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o1.compareTo(o2);
            }
        });

        map.put("b",1);
        map.put("a",4);
        map.put("d",3);
        map.put("c",2);

        for(Map.Entry<String,Integer> entry :map.entrySet()) System.out.println(entry.getKey()+" "+entry.getValue());
a 4
b 1
c 2
d 3

Process finished with exit code 0

TreeMap的按值排序還是跟HashMap的一樣靠ArrayList實現的就不寫了;

HashMap的實現原理

HashMap是一個由數組和單鏈表組成的散列桶,

發佈了124 篇原創文章 · 獲贊 9 · 訪問量 2480
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章