【Java】集合類詳解

引言:java.util 中的集合類包含 Java 中某些最常用的類。最常用的集合類是 List 和 Map。Map 提供了一個更通用的元素存儲方法。Map 集合類用於存儲元素對(稱作“鍵”和“值”),其中每個鍵映射到一個值。本文主要介紹java map的初始化、用法、map的四種常用的遍歷方式、map的排序以及常用api。

java集合框架圖

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 中的鍵-值映射的數目
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章