Java集合类之Map

Map是一种键-值对(key-value)集合,Map 集合中的每一个元素都包含一个键对象和一个值对象。

Map家族

Map家族

图中省略了部分不常见的实现类和接口。

Map源码

下面是Map接口的源码(删除了在1.8中添加的default方法以及Entry中的static方法)。

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
37
38
39
40
41
42
43
44
45
46
public interface Map<K,V> {
// Query Operations
int size();

boolean isEmpty();

boolean containsKey(Object key);

boolean containsValue(Object value);

V get(Object key);

// Modification Operations
V put(K key, V value);

V remove(Object key);

// Bulk Operations
void putAll(Map<? extends K, ? extends V> m);

void clear();

// Views
Set<K> keySet();

Collection<V> values();

Set<Map.Entry<K, V>> entrySet();

interface Entry<K,V> {
K getKey();

V getValue();

V setValue(V value);

boolean equals(Object o);

int hashCode();
}

// Comparison and hashing
boolean equals(Object o);

int hashCode();
}

遍历Map

Map<String, String>为例:

使用for-each循环

1
2
3
for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println(entry.getKey() + ":" + entry.getValue());
}

使用迭代器

1
2
3
4
5
Iterator<Map.Entry<String, String>> iter = map.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry<String, String> entry = iter.next();
System.out.println(entry.getKey() + ":" + entry.getValue());
}

遍历键-然后取值

1
2
3
for (String key : map.keySet()) {
System.out.println(key + ":" + map.get(key));
}

分开遍历键和值

1
2
3
4
5
6
for (String key : map.keySet()) {
System.out.println(key);
}
for (String value : map.values()) {
System.out.println(value);
}

forEach方法

1
2
3
map.forEach((k, v) -> {
System.out.println(k + ":" + v);
});

实现类比较

实现类 存储结构 是否允许为null 是否线程安全 默认初始容量 扩容机制(n为原来的容量)
TreeMap 红黑树 不允许任何记录的键为null,但可以有多条记录的值为null。 线程不安全
HashMap 数组+单链表+红黑树 最多允许一个记录的键为null,但可以有多条记录的值为null。 线程不安全 16 2n
LinkedHashMap 数组+单链表+红黑树+双链表 最多允许一个记录的键为null,但可以有多条记录的值为null。 线程不安全 16 2n
Hashtable 数组+单链表 不允许任何记录的键或者值为null。 线程安全 11 2n + 1
ConcurrentHashMap 数组+单链表+红黑树 不允许任何记录的键或者值为null。 线程安全 16 2n

----------本文结束感谢您的阅读----------
坚持原创技术分享,您的支持将鼓励我继续创作!