前言
前面介绍集合的框架时,我们提到集合框架中主要有List
,Set
,Map
三种数据类型,List
我们已经分析过了,而Set
的实现依赖于Map
,HashSet
是通过HashMap
实现的,TreeSet
是通过TreeMap
实现的,因此我们再来分析Map
。
本文源码分析基于jdk 1.8.0_121
关系图
Map
是具有映射关系的集合接口,储存内容是键值对AbstractMap
是继承于Map
的抽象类,实现了Map
中大部分方法,类似AbstractList
SortedMap
是继承于Map
的接口,储存有序的键值对,排序是通过Comparator
实现的NavigableMap
是继承于SortedMap
的接口,NavigableMap
有一系列的导航方法;如”获取大于/等于某对象的键值对”、“获取小于/等于某对象的键值对”等等TreeMap
继承于AbstractMap
,并实现了NavigableMap
接口,储存有序的键值对HashMap
继承于AbstractMap
,存储无序的键值对WeakHashMap
继承于AbstractMap
,存储无序的“弱键值对”Hashtable
继承于Dictionary
,实现了Map
接口,储存无序的键值对,且是线程安全的,支持Enumeration
遍历。
Map
Map的定义如下:
其储存了键值对,且不允许包含重复的键,一个键只能对应一个值,Map
可以单独查看键集、值集或键-值映射关系。
Map API
|
|
keySet()
方法用于返回键集values()
方法用于返回值集entrySet()
方法用于返回键-值映射关系
Map.Entry
其定义如下:
Map.Entry
是Map
的内部接口,Map.Entry
是键值对,Map通过entrySet()
获取Map.Entry
的键值对集合。
Map.Entry API
|
|
AbstractMap
其定义如下:
AbstractMap
提供了Map的大部分实现,要实现不可修改的映射,只需扩展此类并提供 entrySet()
方法的实现即可。要实现可修改的映射,编程人员必须另外重写此类的 put
方法(否则将抛出 UnsupportedOperationException
),entrySet().iterator()
返回的迭代器也必须另外实现其 remove
方法。
AbstractMap API
|
|
SortedMap
其定义如下:
SortedMap
是一个有序的键值映射,排序方式有两种:自然排序和指定Comparator
。
SortedMap API
|
|
NavigableMap
其定义如下:
NavigableMap
是继承于SortedMap
的接口,具有了针对给定搜索目标返回最接近匹配项的导航方法。
NavigableMap API
|
|
lowerEntry
、floorEntry
、ceilingEntry
和higherEntry
分别返回与小于、小于等于、大于等于、大于给定键的键关联的Map.Entry
对象,如果不存在这样的键,则返回null
firstEntry、pollFirstEntry、lastEntry 和 pollLastEntry
方法,它们返回和/或移除最小和最大的映射关系(如果存在),否则返回 null。lowerKey、floorKey、ceilingKey 和 higherKey
分别返回与小于、小于等于、大于等于、大于给定键的键navigableKeySet、descendingKeySet
分别获取正序/反序的键集,descendingMap()
返回此映射中所包含映射关系的逆序视图headMap、subMap、tailMap
返回特定的键-值对的子集
Dictionary
其定义如下:
|
|
NavigableMap
是JDK 1.0
定义的键值对的接口,它也包括了操作键值对的基本函数。
Dictionary API
|
|