引言:java.util 中的集合類包含 Java 中某些最常用的類。最常用的集合類是 List 和 Map。Map 提供了一個更通用的元素存儲方法。Map 集合類用於存儲元素對(稱作“鍵”和“值”),其中每個鍵映射到一個值。本文主要介紹java map的初始化、用法、map的四種常用的遍歷方式、map的排序以及常用api。
文章目錄
java集合框架圖
不清楚集合之間的關係請先看下:【Java】集合類說明及區別
list,set,map對比
接口 | 子接口 | 是否有序 | 是否允許元素重複 |
---|---|---|---|
Collection | 否 | ||
List | ArrayList | 否 | 是 |
LinkedList | 否 | 是 | |
Vector | 否 | 是 | |
Set | AbstractSet | 否 | 否 |
HashSet | 否 | 否 | |
TreeSet | 是 (用二叉排序樹) | 否 | |
Map | AbstractMap | 否 | 使用key-value來映射和存儲數據,key必須唯一,value可以重複 |
HashMap | 否 | ||
TreeMap | 是(用二叉排序樹) | 使用key-value來映射和存儲數據,key必須唯一,value可以重複 |
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
類型區別
1.HashMap
最常用的Map,它根據鍵的HashCode 值存儲數據,根據鍵可以直接獲取它的值,具有很快的訪問速度。HashMap最多隻允許一條記錄的鍵爲Null(多條會覆蓋);允許多條記錄的值爲 Null。非同步的。
2.TreeMap
能夠把它保存的記錄根據鍵(key)排序,默認是按升序排序,也可以指定排序的比較器,當用Iterator 遍歷TreeMap時,得到的記錄是排過序的。TreeMap不允許key的值爲null。非同步的。
3.Hashtable
與 HashMap類似,不同的是:key和value的值均不允許爲null;它支持線程的同步,即任一時刻只有一個線程能寫Hashtable,因此也導致了Hashtale在寫入時會比較慢。
4.LinkedHashMap
保存了記錄的插入順序,在用Iterator遍歷LinkedHashMap時,先得到的記錄肯定是先插入的.在遍歷的時候會比HashMap慢。key和value均允許爲空,非同步的。
其他
keySet()方法返回值是Map中key值的集合;entrySet()的返回值也是返回一個Set集合,此集合的類型爲Map.Entry。
Map.Entry是Map聲明的一個內部接口,此接口爲泛型,定義爲Entry<K,V>。它表示Map中的一個實體(一個key-value對)。接口中有getKey(),getValue方法。
用法示例
以HashMap爲例:
構造數據:
Map<String,Object> res = new HashMap<String,Object>();
res.put("d","h");
res.put("c","g");
res.put("b","f");
res.put("a","e");
1.增強型for循環遍歷
keySet()遍歷
System.out.println("keySet()-For循環");
for(String s : res.keySet()){
System.out.println(s+":"+res.get(s));
}
輸出:
keySet()-For循環
a:e
b:f
c:g
d:h
entrySet()遍歷
System.out.println("entrySet()-For循環");
for(Map.Entry<String,Object> entry : res.entrySet()){
System.out.println(entry.getKey()+":"+entry.getValue());
}
輸出:
entrySet()-For循環
a:e
b:f
c:g
d:h
2.Iterator迭代器遍歷
keySet()遍歷
System.out.println("keySet()-Iterator迭代器");
Iterator <String> it = res.keySet().iterator();
while (it.hasNext()){
String key = it.next();
System.out.println(key+":"+res.get(key));
}
輸出:
keySet()-Iterator迭代器
a:e
b:f
c:g
d:h
entrySet()遍歷
System.out.println("entrySet()-Iterator迭代器");
Iterator<Map.Entry<String,Object>> it1 = res.entrySet().iterator();
while (it1.hasNext()){
Map.Entry<String,Object> entry = it1.next();
System.out.println(entry.getKey()+":"+entry.getValue());
}
輸出:
entrySet()-Iterator迭代器
a:e
b:f
c:g
d:h
遍歷性能總結:
1.增強for循環使用方便,但性能較差,不適合處理超大量級的數據。
2.迭代器的遍歷速度要比增強for循環快很多,是增強for循環的2倍左右。
3.使用entrySet遍歷的速度要比keySet快很多,是keySet的1.5倍左右。
3.使用比較器對map進行排序
對key排序:
List<Map.Entry<String,Object>> list = new ArrayList<Map.Entry<String, Object>>(res.entrySet());
//比較器實現比較排序
Collections.sort(list, new Comparator<Map.Entry<String, Object>>() {
@Override //重寫 Comparator<Map.Entry<String, Object>>() 方法
public int compare(Map.Entry<String, Object> o1, Map.Entry<String, Object> o2) {
return o1.getKey().compareTo(o1.getKey());
}
});
for (Map.Entry<String,Object> mapping : list){
System.out.println(mapping.getKey()+":"+mapping.getValue());
}
輸出
a:e
b:f
c:g
d:h
對value排序:
List<Map.Entry<String,Object>> list = new ArrayList<Map.Entry<String, Object>>(res.entrySet()); //比較器實現比較排序
//Collections是提供一系列靜態方法的靜態工具類,而collection是集合類的頂級接口
Collections.sort(list, new Comparator<Map.Entry<String, Object>>() {
//
@Override
public int compare(Map.Entry<String, Object> o1, Map.Entry<String, Object> o2) {
return o1.getValue().toString().compareTo(o1.getValue().toString());
}
});
for (Map.Entry<String,Object> mapping : list){
System.out.println(mapping.getKey()+":"+mapping.getValue());
}
輸出
d:h
a:e
b:f
c:g
d:h
4.其他api
函數 | 功能 |
---|---|
clear() | 從 Map 中刪除所有映射 |
remove(Object key) | 從 Map 中刪除鍵和關聯的值 |
put(Object key, Object value) | 將指定值與指定鍵相關聯 |
putAll(Map t) | 將指定 Map 中的所有映射覆制到此 map |
entrySet() | 返回 Map 中所包含映射的 Set 視圖。Set 中的每個元素都是一個 Map.Entry 對象,可以使用 getKey() 和 getValue() 方法(還有一個 setValue() 方法)訪問後者的鍵元素和值元素 |
keySet() | 返回 Map 中所包含鍵的 Set 視圖。刪除 Set 中的元素還將刪除 Map 中相應的映射(鍵和值) |
values() | 返回 map 中所包含值的 Collection 視圖。刪除 Collection 中的元素還將刪除 Map 中相應的映射(鍵和值) |
get(Object key) | 返回與指定鍵關聯的值 |
containsKey(Object key) | 如果 Map 包含指定鍵的映射,則返回 true |
containsValue(Object value) | 如果此 Map 將一個或多個鍵映射到指定值,則返回 true |
isEmpty() | 如果 Map 不包含鍵-值映射,則返回 true |
size() | 返回 Map 中的鍵-值映射的數目 |