程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 關於java中Map的九年夜成績剖析

關於java中Map的九年夜成績剖析

編輯:關於JAVA

關於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();

以上就是本文的全體內容,願望對年夜家的進修有所贊助,也願望年夜家多多支撐。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved