Map幾種實現及其簡介
阿新 • • 發佈:2018-04-21
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幾種實現及其簡介