1. 程式人生 > >Map幾種實現及其簡介

Map幾種實現及其簡介

new t 鍵值對 com src 最近最少使用算法 與或 RR first 初始化

前言

本文主要介紹TreeMap、HashMap、LinkedHashMap和ConcurrentHashMap。他們之間的大致關系如下圖所示:
技術分享圖片

這四種Map各自的特點如下:

  • HashMap作為編程的首選項,速度最快;
  • LinkedHashMap 取“鍵值對”的順序是其插入的順序,速度比HashMap慢一點,但是遍歷叠代的速度更快;
  • TreeMap 基於紅黑樹的實現,所得到的結果可以經過自定義的排序類進行排序,含有獲取子樹的方法;
  • ConcurrentHashMap 線程安全的Map;

Map中鍵必須是唯一的,值可以重復,如果鍵值與或者是根據自定義的“比較類”在邏輯上是相同大小,則會覆蓋前一個值

1.SortedMap/TreeMap

SortedMap是基於紅黑樹的實現,如右圖所示,TreeMap使其唯一的實現類,使用SortedMap可以確保鍵處於排序的狀態,其特性如下:

  • Comparator類作為構造器參數,重載其compare(obj1,obj2)方法自定義排序方式;
  • T firstKey()和 T lastKey()返回當前有序的Map第一個和最後一個鍵;
  • SortedMap subMap(fromKey,toKey);SortedMap headMap(toKey); SortedMap tailMap(fromKey)生成Map的子集/子樹,分別指定了起始key值、指定起始值、指定結束值;

重申:如果鍵值與或者是根據自定義的“比較類”在邏輯上是相同大小,則會覆蓋前一個值

public class TreeMapDemo {
    public static void main(String[] args) {
        TreeMap<Integer,String> linkedMap=new TreeMap<>(
                new Comparator<Integer>() {//與key類型對齊
                    @Override//根據參數o1與參數o2比較大小返回正、0、負,小的在前邊;
                    public int compare(Integer o1, Integer o2) {
                        return Math.abs(o1-2)-Math.abs(o2-2);
                    }
                }
        );
        linkedMap.put(1,"du");
        linkedMap.put(2,"gen");
        linkedMap.put(3,"kui");//因為根據自定義的比較類,3和1在邏輯上是大小的(距離2),因此會覆蓋(1,“du");
        linkedMap.put(1,"gen");
        System.out.println(linkedMap);//輸出順序為從小到大
    }
}
2.LinkedHashMap

LinkedHashMap有如下特點:

  • 速度比Hash稍微慢,但是遍歷叠代的速度比HashMap塊;
  • 以元素插入的順序打印元素,但是
  • 可以在構造器中設置是否采用基於訪問的“最近最少使用算法LRU”,即get(key)最少的元素使用默認方式打印時放在最前邊;

示例代碼如下:

public class LinkedHashMapDemo {
    public static void main(String[] args) {
        //溝槽參數分別是初始化容量、裝載因子和是否開啟LRU
        LinkedHashMap<Integer,String> linkedMap=new LinkedHashMap<>(10,0.75f,true);
        linkedMap.put(1,"du");
        linkedMap.put(2,"gen");
        linkedMap.put(3,"kui");
        System.out.println(linkedMap);//以裝載方式打印

        linkedMap.get(2);
        System.out.println(linkedMap);//可以看到被訪問的元素靠後打印了
    }
}

Map幾種實現及其簡介