与 Collection 部分相比,Java 集合框架的 Map 部分相对简单,其大致结构如下图所示:
Map 接口
Map
接口是 Map 部分的根接口,它规定了 map 结构内部的 key-value 对称为 entry,一个 map 中的 key 不能有重复,一个 key 仅能对应一个 value。
对于该接口来说,最重要的内容是其定义了如下 3 个 view 方法:
Set<K> keySet();
Collection<V> values();
Set<Map.Entry<K, V>> entrySet();
除此之外, Map
接口定义的几个 default method 也很实用:
default V getOrDefault(Object key, V defaultValue) {...}
default V putIfAbsent(K key, V value) {...}
default void forEach(BiConsumer<? super K, ? super V> action) {...}
default boolean replace(K key, V oldValue, V newValue) {...}
default void replaceAll(BiFunction<? super K, ? super V, ? extends V> function) {...}
default boolean remove(Object key, Object value) {...}
default V replace(K key, V value) {...}
default V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction) {...}
default V computeIfPresent(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction) {...}
default V compute(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction) {...}
default V merge(K key, V value, BiFunction<? super V, ? super V, ? extends V> remappingFunction) {...}
SortedMap 接口
顾名思义, SortedMap
在 Map
的基础上增加了有序性,这种有序性是按 key 来排序的,有两种排序机制:
- 所有的 key 都实现
Comparable
接口; - 提供一个
Comparator
。
即 SortedMap
的有序性是基于 compareTo()
或 compare()
方法实现的,这自然而然就涉及到 consistent with equals() 的问题,你可以参考前文的介绍,这里不再赘述。
因为有序性的实现,使得我们可以取出 submap,为此 SortedMap
接口提供了如下几个方法:
SortedMap<K,V> subMap(K fromKey, K toKey);
SortedMap<K,V> headMap(K toKey);
SortedMap<K,V> tailMap(K fromKey);
SortedMap
提供了如下 2 个方法也值得注意:
K firstKey();
K lastKey();
NavigableMap 接口
NavigableMap
在 SortedMap
的基础上新增了以下几个特性:
- navigation methods
- a reverse order view of the map
其中 navigation methods 用于返回最匹配的 key,有如下方法:
// < - less than
Map.Entry<K,V> lowerEntry(K key);
K lowerKey(K key);
// <= - less than or equal
Map.Entry<K,V> floorEntry(K key);
K floorKey(K key);
// >= - greater than or equal
Map.Entry<K,V> ceilingEntry(K key);
K ceilingKey(K key);
// > = greater than
Map.Entry<K,V> higherEntry(K key);
K higherKey(K key);
此外, NavigableMap
接口还提供了一个用于返回倒序 map 的方法,方法声明如下所示:
NavigableMap<K,V> descendingMap();
最后, NavigableMap
接口还新增了如下几个实用方法:
Map.Entry<K,V> firstEntry();
Map.Entry<K,V> lastEntry();
Map.Entry<K,V> pollFirstEntry();
Map.Entry<K,V> pollLastEntry();