副标题#e#
前面,我们已经系统的对List举办了进修。接下来,我们先进修Map,再进修Set;因为Set的实现类都是基于Map来实现的(如,HashSet是通过HashMap实现的,TreeSet是通过TreeMap实现的)。
首先,我们看看Map架构。
如上图:
Map 是映射接口,Map中存储的内容是键值对(key-value)。
AbstractMap 是担任于Map的抽象类,它实现了Map中的大部门API。其它Map的实现类可以通过担任AbstractMap来淘汰反复编码。
SortedMap 是担任于Map的接口。SortedMap中的内容是排序的键值对,排序的要领是通过较量器(Comparator)。
NavigableMap 是担任于SortedMap的接口。对比于SortedMap,NavigableMap有一系列的导航要领;如"获取大于/便是某工具的键值对"、“获取小于/便是某工具的键值对”等等。
TreeMap 担任于AbstractMap,且实现了NavigableMap接口;因此,TreeMap中的内容是“有序的键值对”!
HashMap 担任于AbstractMap,但没实现NavigableMap接口;因此,HashMap的内容是“键值对,但不担保序次”!
Hashtable 固然不是担任于AbstractMap,但它担任于Dictionary(Dictionary也是键值对的接口),并且也实现Map接口;因此,Hashtable的内容也是“键值对,也不担保序次”。但和HashMap对比,Hashtable是线程安详的,并且它支持通过Enumeration去遍历。
WeakHashMap 担任于AbstractMap。它和HashMap的键范例差异,WeakHashMap的键是“弱键”。
有了上面的总体框架之后,我们先来看看各个接口和抽象类的先容;后头再对各个实现类举办具体说明。
1 Map
Map的界说如下:
public interface Map<K,V> { }
Map 是一个键值对(key-value)映射接口。Map映射中不能包括反复的键;每个键最多只能映射到一个值。
Map 接口提供三种collection 视图,答允以键集、值集或键-值映射干系集的形式查察某个映射的内容。
Map 映射顺序。有些实现类,可以明晰担保其顺序,如 TreeMap;另一些映射实现则不担保顺序,如 HashMap 类。
Map 的实现类应该提供2个“尺度的”结构要领:第一个,void(无参数)结构要领,用于建设空映射;第二个,带有单个 Map 范例参数的结构要领,用于建设一个与其参数具有沟通键-值映射干系的新映射。实际上,后一个结构要领答允用户复制任意映射,生成所需类的一个等价映射。尽量无法强制执行此发起(因为接口不能包括结构要领),可是 JDK 中所有通用的映射实现都遵从它。
Map的API
abstract void clear() abstract boolean containsKey(Object key) abstract boolean containsValue(Object value) abstract Set<Entry<K, V>> entrySet() abstract boolean equals(Object object) abstract V get(Object key) abstract int hashCode() abstract boolean isEmpty() abstract Set<K> keySet() abstract V put(K key, V value) abstract void putAll(Map<? extends K, ? extends V> map) abstract V remove(Object key) abstract int size() abstract Collection<V> values()
说明:
(01) Map提供接口别离用于返回 键集、值集或键-值映射干系集。
entrySet()用于返回键-值集的Set荟萃
keySet()用于返回键集的Set荟萃
values()用户返回值集的Collection荟萃
因为Map中不能包括反复的键;每个键最多只能映射到一个值。所以,键-值集、键集都是Set,值集时Collection。
(02) Map提供了“键-值对”、“按照键获取值”、“删除键”、“获取容量巨细”等要领。
2 Map.Entry
Map.Entry的界说如下:
interface Entry<K,V> { }
Map.Entry是Map中内部的一个接口,Map.Entry是键值对,Map通过 entrySet() 获取Map.Entry的键值对荟萃,从而通过该荟萃实现对键值对的操纵。
Map.Entry的API
abstract boolean equals(Object object)
abstract K getKey()
abstract V getValue()
abstract int hashCode()
abstract V setValue(V object)
3 AbstractMap
AbstractMap的界说如下:
public abstract class AbstractMap<K,V> implements Map<K,V> {}
AbstractMap类提供 Map 接口的主干实现,以最大限度地淘汰实现此接口所需的事情。
要实现不行修改的映射,编程人员只需扩展此类并提供 entrySet 要领的实现即可,该要领将返回映射的映射干系 set 视图。凡是,返回的 set 将依次在 AbstractSet 上实现。此 set 不支持 add() 或 remove() 要领,其迭代器也不支持 remove() 要领。
#p#分页标题#e#
要实现可修改的映射,编程人员必需别的重写此类的 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 object) 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() String toString() Collection<V> values() Object clone()
4 SortedMap
SortedMap的界说如下:
public interface SortedMap<K,V> extends Map<K,V> { }
SortedMap是一个担任于Map接口的接口。它是一个有序的SortedMap键值映射。
SortedMap的排序方法有两种:自然排序 可能 用户指定较量器。 插入有序 SortedMap 的所有元素都必需实现 Comparable 接口(可能被指定的较量器所接管)。
别的,所有SortedMap 实现类都应该提供 4 个“尺度”结构要领:
(01) void(无参数)结构要领,它建设一个空的有序映射,凭据键的自然顺序举办排序。
(02) 带有一个 Comparator 范例参数的结构要领,它建设一个空的有序映射,按照指定的较量器举办排序。
(03) 带有一个 Map 范例参数的结构要领,它建设一个新的有序映射,其键-值映射干系与参数沟通,凭据键的自然顺序举办排序。
(04) 带有一个 SortedMap 范例参数的结构要领,它建设一个新的有序映射,其键-值映射干系和排序要领与输入的有序映射沟通。无法担保强制实施此发起,因为接口不能包括结构要领。
查察本栏目
#p#副标题#e#
SortedMap的API
// 担任于Map的API abstract void clear() abstract boolean containsKey(Object key) abstract boolean containsValue(Object value) abstract Set<Entry<K, V>> entrySet() abstract boolean equals(Object object) abstract V get(Object key) abstract int hashCode() abstract boolean isEmpty() abstract Set<K> keySet() abstract V put(K key, V value) abstract void putAll(Map<? extends K, ? extends V> map) abstract V remove(Object key) abstract int size() abstract Collection<V> values() // SortedMap新增的API abstract Comparator<? super K> comparator() abstract K firstKey() abstract SortedMap<K, V> headMap(K endKey) abstract K lastKey() abstract SortedMap<K, V> subMap(K startKey, K endKey) abstract SortedMap<K, V> tailMap(K startKey)
5 NavigableMap
NavigableMap的界说如下:
public interface NavigableMap<K,V> extends SortedMap<K,V> { }
NavigableMap是担任于SortedMap的接口。它是一个可导航的键-值对荟萃,具有了为给定搜索方针陈诉最靠近匹配项的导航要领。
NavigableMap别离提供了获取“键”、“键-值对”、“键集”、“键-值对集”的相关要领。
NavigableMap的API
abstract Entry<K, V> ceilingEntry(K key) abstract Entry<K, V> firstEntry() abstract Entry<K, V> floorEntry(K key) abstract Entry<K, V> higherEntry(K key) abstract Entry<K, V> lastEntry() abstract Entry<K, V> lowerEntry(K key) abstract Entry<K, V> pollFirstEntry() abstract Entry<K, V> pollLastEntry() abstract K ceilingKey(K key) abstract K floorKey(K key) abstract K higherKey(K key) abstract K lowerKey(K key) abstract NavigableSet<K> descendingKeySet() abstract NavigableSet<K> navigableKeySet() abstract NavigableMap<K, V> descendingMap() abstract NavigableMap<K, V> headMap(K toKey, boolean inclusive) abstract SortedMap<K, V> headMap(K toKey) abstract SortedMap<K, V> subMap(K fromKey, K toKey) abstract NavigableMap<K, V> subMap(K fromKey, boolean fromInclusive, K toKey, boolean toInclusive) abstract SortedMap<K, V> tailMap(K fromKey) abstract NavigableMap<K, V> tailMap(K fromKey, boolean inclusive)
说明:
#p#分页标题#e#
NavigableMap除了担任SortedMap的特性外,它的提供的成果可以分为4类:
第1类,提供操纵键-值对的要领。
lowerEntry、floorEntry、ceilingEntry 和 higherEntry 要领,它们别离返回与小于、小于便是、大于便是、大于给定键的键关联的 Map.Entry 工具。
firstEntry、pollFirstEntry、lastEntry 和 pollLastEntry 要领,它们返回和/或移除最小和最大的映射干系(假如存在),不然返回 null。
第2类,提供操纵键的要领。这个和第1类较量雷同
lowerKey、floorKey、ceilingKey 和 higherKey 要领,它们别离返回与小于、小于便是、大于便是、大于给定键的键。
第3类,获取键集。
navigableKeySet、descendingKeySet别离获取正序/反序的键集。
第4类,获取键-值对的子集。
6 Dictionary
Dictionary的界说如下:
public abstract class Dictionary<K,V> {}
NavigableMap是JDK 1.0界说的键值对的接口,它也包罗了操纵键值对的根基函数。
Dictionary的API
abstract Enumeration<V> elements() abstract V get(Object key) abstract boolean isEmpty() abstract Enumeration<K> keys() abstract V put(K key, V value) abstract V remove(Object key) abstract int size()