Map 源码注释
开始的第一行就直接说明了 Map 每一个 Key 对应一个 Value 然后 Key 是不允许重复的。他是一个完全抽象的类而不是一个接口,它代替类 Dictionary 类。Map 接口提供了三个集合视图,允许 map 的内容被视为一组键、值的集合,或一组键值的映射。Map 的顺序被定义为 Map 集合视图上的迭代器返回其元素的顺序。一些 Map 的实现,比如 TreeMap 类,对它们的顺序做了特定的保证;而例如 HashMap 类,则没有。
Note:如果可变对象被用作 Map 的键,则必须非常小心。如果对象的值以影响 equals 比较的方式改变,而对象是映射中的键,则不会指定映射的行为。这种禁令的一个特例就是地图不能包含自己作为关键字。但是允许映射包含自己的值,但是要特别小心:在此类映射上, equals 和 hashCode 方法不再被很好地定义。
所有实现了 Map 接口的具有一般用途的类都应该提供两种“标准”的构造函数:(1)一个用来创造一个空的 Map 的无参构造函数(void constructor);(2)一个带有 Map 类型的单个参数的构造函数,它创建一个具有与其参数相投的 键-值 映射的新映射。实际上,后者的构造函数允许用户复制任何 Map,生成所需类的等价 Map。虽然 Map 没有办法执行这个建议(因为接口不能包含构造函数),但是 JDK 中的所有通用映射实现都符合。
如果 Map 不支持这个操作,即包含在这个接口中“破坏性”的方法,也就是修改它们所在的 Map 的方法,那么就会指定抛出一个 UnSupportedOperationException异常。如果是这种情况,调用这些方法(但不是必须的)对 Map 没有影响可能抛出一个 UnSupportedOperationException异常。例如,在不可修改的映射上调用 putAll(Map),如果映射的“叠加”映射是空的,可能(但不是必须)抛出异常。
实现 Map 接口的一些类对它们可能包含的键和值有限制。例如,一些可能会禁止空的 Key 和 values,一些会限制它们 keys 的类型。试图插入一个不合格的 key 或 value 会抛出一个未经检查的异常,一般是
NullPointerException 或 ClassCastException。试图查询一个不合格的 key 和 value 的存在可能会抛出一个异常,或是简单的返回 false。一些实现将展现前者的行为,一些将展现后者的行为。一般来说,尝试对不合格的键值来进行操作,其操作的完成不会导致将不合格的元素插入到映射中可能会引发异常,或者可能会成功执行。这个例外在这个接口的规范中被标记为“可选的”。
集合框架接口中的许多方法是根据等效方法定义的,例如,{@link #containsKey(Object)containsKey(Object key)}方法的规范说:“返回true”当且仅当这个映射包含一个关键字的映射 (key == null?k == null:key.equals(k))。这个规范不应该被解释为暗示用一个非空参数<key>调用 Map.containsKey 会导致key.equals( k)被调用的任何键 k 。实现可以自由地实现优化,从而避免了 equals 调用,例如通过首先比较两个键的哈希码。({@link Object#hashCode()}规范保证了哈希码不相等的两个对象不能相等。)更一般地说,各种集合框架接口的实现可以自由地利用实现者认为适当的任何底层方法的指定行为。
执行映射递归遍历的某些映射操作可能会失败,并且映射直接或间接包含自身的自我引用实例。这包括clone(),equals(),hashCode()和toString()方法。实现可以选择处理自引用场景,然而大多数当前的实现不这样做。
- @author Josh Bloch
- @see HashMap
- @see TreeMap
- @see Hashtable
- @see SortedMap
- @see Collection
- @see Set
Map 的函数(public interface Map<K,V>)
查询操作
int size():返回此映射中键值的映射数量,如果超过 Integer.MAX_VALUE 则返回 Integer.MAX_VALUE
boolean isEmpty():如果此映射不包含键值映射,则返回 true
boolean containsKey(Object key):如果这个映射包含指定键的映射,则返回 true
boolean containsValue(Object value):如果此映射将一个或多个键映射到指定的值,则返回 true。
V get(Object key):返回指定的键映射到的值;如果此映射不包含键的映射,则返回 null
修改操作
V put(K key,V value):将指定的值与此 Map 中指定的键相关联(可选操作)。如果 Map 以前包含一个映射键,则旧值被指定的值替换.
V remove(Object key):如果存在,则从该映射中除去该映射
批量操作
void putAll(Map<?extends K,? extends V> m):将指定映射的所有映射复制到此映射。 m 映射被存储在这个映射中。
void clear():从该映射中删除所有映射,执行该方法后,Map 将为空。
查看(Views)
Set<K> keySet():返回一个包含在此映射中的键的集合视图.
Collection<V> values():返回该 Map 中包含的值的集合视图
Set<Map.Entry<K,V>> entrySet():返回此映射中包含的映射的 Set视图
interface Entry<K,V>
Map.entrySet 方法返回地图的集合视图,其元素是这个类的。获取对 Map 条目的引用的唯一方法是从这个集合视图的迭代器中获取。
每个 Map.Entry 其实就是一个 key-value 对.