Java map 詳解 - 用法、遍歷、排序、常用API等

zhaozhangxiao 發表於 2022-01-25
Java

概要:

Map 提供了一個更通用的元素儲存方法。Map 集合類用於儲存元素對(稱作“鍵”和“值”),其中每個鍵對映到一個值。
本文主要介紹java map的初始化、用法、map的四種常用的遍歷方式、map的排序以及常用api。
## 1Map用法

### 型別介紹

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

### 型別區別

HashMap

最常用的Map,它根據鍵的HashCode 值儲存資料,根據鍵可以直接獲取它的值,具有很快的訪問速度。HashMap最多隻允許一條記錄的鍵為Null(多條會覆蓋);允許多條記錄的值為 Null。非同步的。

TreeMap

能夠把它儲存的記錄根據鍵(key)排序,預設是按升序排序,也可以指定排序的比較器,當用Iterator 遍歷TreeMap時,得到的記錄是排過序的。TreeMap不允許key的值為null。非同步的。 
Hashtable

與 HashMap類似,不同的是:key和value的值均不允許為null;它支援執行緒的同步,即任一時刻只有一個執行緒能寫Hashtable,因此也導致了Hashtale在寫入時會比較慢。 
LinkedHashMap

儲存了記錄的插入順序,在用Iterator遍歷LinkedHashMap時,先得到的記錄肯定是先插入的.在遍歷的時候會比HashMap慢。key和value均允許為空,非同步的。

初始化資料

User user1 = new User(1, "A", "xx1", "xx2", "xx3");
User user2 = new User(2, "B", "xx1", "xx2");
User user3 = new User(3, "C", "xx1");
User user4 = new User(4, "D", "xx1", "xx2", "xx3");
List<User> list = new ArrayList<>();
list.add(user1);
list.add(user2);
list.add(user3);
list.add(user4);

stream流分組取值
Map<String, Long> collect1 = list.stream().filter(s -> s.getCateOneId() != null).collect(Collectors.groupingBy(s -> s.getCateOneId(), Collectors.counting()));
System.out.println(collect1);
Integer counts = 0;
Iterator<Map.Entry<String, Long>> iterator = collect1.entrySet().iterator();
while (iterator.hasNext()) {
    Map.Entry<String, Long> entry = iterator.next();
    counts =  entry.getValue().intValue();
}
System.out.println(counts);
Map<String, Long> collect2 = list.stream().filter(s -> s.getCateTwoId() != null).collect(Collectors.groupingBy(s -> s.getCateTwoId(), Collectors.counting()));
System.out.println(collect2);
Map<String, Long> collect3 = list.stream().filter(s -> s.getCateThreeId() != null).collect(Collectors.groupingBy(s -> s.getCateThreeId(), Collectors.counting()));
System.out.println(collect3);

Iterator<Map.Entry<String, Long>> iterator2 = collect2.entrySet().iterator();
while (iterator2.hasNext()){
    Map.Entry<String, Long> next = iterator2.next();
    int i = next.getValue().intValue();
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結