Java Map 概述

写在前面

  • 由于个人水平有限,故部分内容可能会出现错误,还请包涵

思维导图

Map 接口

Map 集合类用于存储键-值对,在 Map 接口中定义了一个内部接口 Entry<K, V>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// Map.entrySet() 方法返回 Map 中所包含映射的 Set 视图
// 即此接口实现类对象组成的 Set 对象
interface Entry<K,V> {

K getKey();

V getValue();

V setValue(V value);

boolean equals(Object o);

int hashCode();

public static <K extends Comparable<? super K>, V> Comparator<Map.Entry<K,V>> comparingByKey() {
return (Comparator<Map.Entry<K, V>> & Serializable)
(c1, c2) -> c1.getKey().compareTo(c2.getKey());
}

public static <K, V extends Comparable<? super V>> Comparator<Map.Entry<K,V>> comparingByValue() {
return (Comparator<Map.Entry<K, V>> & Serializable)
(c1, c2) -> c1.getValue().compareTo(c2.getValue());
}

public static <K, V> Comparator<Map.Entry<K, V>> comparingByKey(Comparator<? super K> cmp) {
Objects.requireNonNull(cmp);
return (Comparator<Map.Entry<K, V>> & Serializable)
(c1, c2) -> cmp.compare(c1.getKey(), c2.getKey());
}

public static <K, V> Comparator<Map.Entry<K, V>> comparingByValue(Comparator<? super V> cmp) {
Objects.requireNonNull(cmp);
return (Comparator<Map.Entry<K, V>> & Serializable)
(c1, c2) -> cmp.compare(c1.getValue(), c2.getValue());
}
}

Map 无法直接用 Iterator 进行遍历,而是需要先获取 Map 的视图,有三种方式,分别是:

  • entrySet():返回 Map 中所包含映射的 Set 视图
  • keySet():返回 Map 中所包含 key 的 Set 视图(因为 key 不能重复,故使用 Set 视图)
  • values():返回 Map 中所包含 value 的 Collection 视图

HashMap

具体见 HashMap 及 ConcurrentHashMap 解析

LinkedHashMap

具体见 LinkedHashMap 解析