Map是一种键-值对(key-value)集合,Map 集合中的每一个元素都包含一个键对象和一个值对象。
Map家族
图中省略了部分不常见的实现类和接口。
Map源码
下面是Map接口的源码(删除了在1.8中添加的default方法以及Entry中的static方法)。
1 | public interface Map<K,V> { |
遍历Map
以Map<String, String>
为例:
使用for-each循环
1 | for (Map.Entry<String, String> entry : map.entrySet()) { |
使用迭代器
1 | Iterator<Map.Entry<String, String>> iter = map.entrySet().iterator(); |
遍历键-然后取值
1 | for (String key : map.keySet()) { |
分开遍历键和值
1 | for (String key : map.keySet()) { |
forEach方法
1 | map.forEach((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 |