系列文章:
前言
前面介绍集合的框架时,我们提到集合框架中主要有List,Set,Map三种数据类型,List我们已经分析过了,而Set的实现依赖于Map,HashSet是通过HashMap实现的,TreeSet是通过TreeMap实现的,因此我们再来分析Map。
本文源码分析基于jdk 1.8.0_121
关系图

Map框架
-
Map是具有映射关系的集合接口,储存内容是键值对 -
AbstractMap是继承于Map的抽象类,实现了Map中大部分方法,类似AbstractList -
SortedMap是继承于Map的接口,储存有序的键值对,排序是通过Comparator实现的 -
NavigableMap是继承于SortedMap的接口,NavigableMap有一系列的导航方法;如"获取大于/等于某对象的键值对"、“获取小于/等于某对象的键值对”等等 -
TreeMap继承于AbstractMap,并实现了NavigableMap接口,储存有序的键值对 -
HashMap继承于AbstractMap,存储无序的键值对 -
WeakHashMap继承于AbstractMap,存储无序的“弱键值对” -
Hashtable继承于Dictionary,实现了Map接口,储存无序的键值对,且是线程安全的,支持Enumeration遍历。
Map
Map的定义如下:
public interface Map<K,V>
其储存了键值对,且不允许包含重复的键,一个键只能对应一个值,Map可以单独查看键集、值集或键-值映射关系。
Map API
void clear()
boolean containsKey(Object key)
boolean containsValue(Object value)
Set<Entry<K, V>> entrySet()
boolean equals(Object o)
V get(Object key)
int hashCode()
boolean isEmpty()
Set<K> keySet()
V put(K key, V value)
void putAll(Map<? extends K, ? extends V> map)
V remove(Object key)
int size()
Collection<V> values()
-
keySet()方法用于返回键集 -
values()方法用于返回值集 -
entrySet()方法用于返回键-值映射关系
Map.Entry
其定义如下:
interface Entry<K,V>
Map.Entry是Map的内部接口,Map.Entry是键值对,Map通过entrySet() 获取Map.Entry的键值对集合。
Map.Entry API
K getKey();
V getValue();
V setValue(V value);
boolean equals(Object o);
int hashCode();
AbstractMap
其定义如下:
public abstract class AbstractMap<K,V> implements Map<K,V>
AbstractMap提供了Map的大部分实现,要实现不可修改的映射,只需扩展此类并提供 entrySet()方法的实现即可。要实现可修改的映射,编程人员必须另外重写此类的 put 方法(否则将抛出 UnsupportedOperationException),entrySet().iterator() 返回的迭代器也必须另外实现其 remove 方法。
AbstractMap API
abstract Set<Entry<K, V>> entrySet()
void clear()
boolean containsKey(Object key)
boolean containsValue(Object value)
boolean equals(Object o)
V get(Object key)
int hashCode()
boolean isEmpty()
Set<K> keySet()
V put(K key, V value)
void putAll(Map<? extends K, ? extends V> m)
V remove(Object key)
int size()
String toString()
Collection<V> values()
Object clone()
SortedMap
其定义如下:
public interface SortedMap<K,V> extends Map<K,V>
SortedMap是一个有序的键值映射,排序方式有两种:自然排序和指定Comparator。
SortedMap API
Comparator<? super K> comparator()
K firstKey()
SortedMap<K, V> headMap(K endKey)
K lastKey()
SortedMap<K, V> subMap(K startKey, K endKey)
SortedMap<K, V> tailMap(K startKey)
Set<K> keySet();
Collection<V> values();
Set<Map.Entry<K, V>> entrySet();
NavigableMap
其定义如下:
public interface NavigableMap<K,V> extends SortedMap<K,V>
NavigableMap是继承于SortedMap的接口,具有了针对给定搜索目标返回最接近匹配项的导航方法。
NavigableMap API
Entry<K, V> ceilingEntry(K key)
Entry<K, V> firstEntry()
Entry<K, V> floorEntry(K key)
Entry<K, V> higherEntry(K key)
Entry<K, V> lastEntry()
Entry<K, V> lowerEntry(K key)
Entry<K, V> pollFirstEntry()
Entry<K, V> pollLastEntry()
K ceilingKey(K key)
K floorKey(K key)
K higherKey(K key)
K lowerKey(K key)
NavigableSet<K> descendingKeySet()
NavigableSet<K> navigableKeySet()
NavigableMap<K, V> descendingMap()
NavigableMap<K, V> headMap(K toKey, boolean inclusive)
SortedMap<K, V> headMap(K toKey)
SortedMap<K, V> subMap(K fromKey, K toKey)
NavigableMap<K, V> subMap(K fromKey, boolean fromInclusive, boolean toInclusive)
SortedMap<K, V> tailMap(K fromKey)
NavigableMap<K, V> tailMap(K fromKey, boolean inclusive)
-
lowerEntry、floorEntry、ceilingEntry和higherEntry分别返回与小于、小于等于、大于等于、大于给定键的键关联的Map.Entry对象,如果不存在这样的键,则返回null -
firstEntry、pollFirstEntry、lastEntry 和 pollLastEntry方法,它们返回和/或移除最小和最大的映射关系(如果存在),否则返回 null。 -
lowerKey、floorKey、ceilingKey 和 higherKey分别返回与小于、小于等于、大于等于、大于给定键的键 -
navigableKeySet、descendingKeySet分别获取正序/反序的键集,descendingMap()返回此映射中所包含映射关系的逆序视图 -
headMap、subMap、tailMap返回特定的键-值对的子集
Dictionary
其定义如下:
public abstract class Dictionary<K,V>
NavigableMap是JDK 1.0定义的键值对的接口,它也包括了操作键值对的基本函数。
Dictionary API
Enumeration<V> elements()
V get(Object key)
boolean isEmpty()
Enumeration<K> keys()
V put(K key, V value)
V remove(Object key)
int size()