關於java中Map的九年夜成績剖析。本站提示廣大學習愛好者:(關於java中Map的九年夜成績剖析)文章只能為提供參考,不一定能成為您想要的結果。以下是關於java中Map的九年夜成績剖析正文
平日來講,Map是一個由鍵值對構成的數據構造,且在聚集中每一個鍵是獨一的。上面就以K和V來代表鍵和值,來講明一下java中關於Map的九年夜成績。
0、將Map轉換為List類型
在java中Map接口供給了三種聚集獲得方法:Key set,,value set, and key-value set.。它們都可以經由過程結構辦法或許addAll()辦法來轉換為List類型。上面代碼就解釋了若何從Map中結構ArrayList:
// key list List keyList = new ArrayList(map.keySet()); // value list List valueList = new ArrayList(map.valueSet()); // key-value list List entryList = new ArrayList(map.entrySet());
1、經由過程Entry 遍歷Map
java中這類以鍵值對存在的方法被稱為Map.Entry。Map.entrySet()前往的是一個key-value 聚集,這是一種異常高效的遍歷方法。
for(Entry entry: map.entrySet()) { // get key K key = entry.getKey(); // get value V value = entry.getValue(); }
Iterator 我們也常常用到,特別是在JDK1.5之前
Iterator itr = map.entrySet().iterator(); while(itr.hasNext()) { Entry entry = itr.next(); // get key K key = entry.getKey(); // get value V value = entry.getValue(); }
2、經由過程Key來對Map排序
排序須要對Map的ke停止頻仍的操作,一種方法就是經由過程比擬器(comparator )來完成:
List list = new ArrayList(map.entrySet()); Collections.sort(list, new Comparator() { @Override public int compare(Entry e1, Entry e2) { return e1.getKey().compareTo(e2.getKey()); } });
別的一種辦法就是經由過程SortedMap,但必需要完成Comparable接口。
SortedMap sortedMap = new TreeMap(new Comparator() { @Override public int compare(K k1, K k2) { return k1.compareTo(k2); } }); sortedMap.putAll(map);
3、對value對Map停止排序
這與上一點有些相似,代碼以下:
List list = new ArrayList(map.entrySet()); Collections.sort(list, new Comparator() { @Override public int compare(Entry e1, Entry e2) { return e1.getValue().compareTo(e2.getValue()); } });
4、初始化一個static 的常量Map
當你願望創立一個全局靜態Map的時刻,我們有以下兩種方法,並且是線程平安的。
而在Test1中,我們固然聲清楚明了map是靜態的,然則在初始化時,我們仍然可以轉變它的值,就像Test1.map.put(3,"three");
在Test2中,我們經由過程一個外部類,將其設置為弗成修正,那末當我們運轉Test2.map.put(3,"three")的時刻,它就會拋出一個
UnsupportedOperationException 異常來制止你修正。 public class Test1 { private static final Map map; static { map = new HashMap(); map.put(1, "one"); map.put(2, "two"); } } public class Test2 { private static final Map map; static { Map aMap = new HashMap(); aMap.put(1, "one"); aMap.put(2, "two"); map = Collections.unmodifiableMap(aMap); } }
5、HashMap, TreeMap, and Hashtable之間的分歧
在Map接口中,共有三種完成:HashMap,TreeMap,Hashtable。
它們之間各有分歧,具體內容請參考《 HashMap vs. TreeMap vs. Hashtable vs. LinkedHashMap》一文。
6、Map中的反向查詢
我們在Map添加一個鍵值對後,意味著這在Map中鍵和值是逐個對應的,一個鍵就是對應一個值。然則有時刻我們須要反向查詢,好比經由過程某一個值來查找它的鍵,這類數據構造被稱為bidirectional map,遺憾的是JDK並沒有對其支撐。
Apache和Guava 配合供給了這類bidirectional map完成,它在完成中它劃定了鍵和值都是必需是1:1的關系。
7、對Map的復制
java中供給了許多辦法都可以完成對一個Map的復制,然則那些辦法不見得會不時同步。簡略說,就是一個Map產生的變更,而復制的誰人仍然堅持原樣。上面是一個比擬高效的完成辦法:
Map copiedMap = Collections.synchronizedMap(map);
固然還有別的一個辦法,那就是克隆。然則我們的java開山祖師Josh Bloch卻不推舉這類方法,他已經在一次訪談中說過關於Map克隆的成績:在許多類中都供給了克隆的辦法,由於人們確切須要。然則克隆異常有局限性,並且在許多時刻形成了不用要的影響。(原文《Copy constructor versus cloning》)
8、創立一個空的Map
假如這個map被置為弗成用,可以經由過程以下完成
map = Collections.emptyMap();
相反,我們會用到的時刻,便可以直接
map = new HashMap();
以上就是本文的全體內容,願望對年夜家的進修有所贊助,也願望年夜家多多支撐。