Map接口
将键映射到值的对象。map 不能包含重复的键;每个键最多可以映射到一个值。
这个接口取代了Dictionary 类,后者是一个完全抽象的类,而不是接口。
Map接口提供了三个集合视图,允许将映射的内容视为一组键、一组值或一组键值映射。映射的顺序定义为映射集合视图上的迭代器返回其元素的顺序。一些map实现,如TreeMap类,对它们的顺序做出了特定的保证;其他类,如HashMap类,则没有。
注意:如果将可变对象用作映射键,则必须非常小心。如果对象的值以影响equals比较的方式更改,而对象是映射中的键,则不指定映射的行为。这种禁止的一种特殊情况是,不允许地图将自身包含为键。虽然允许一个映射将自身包含为一个值,但还是要特别小心:equals和hashCode方法在这样的映射上已经没有很好的定义。
所有通用映射实现类都应提供两个“标准”构造函数:一个是创建空映射的void(无参数)构造函数,另一个是具有map类型的单个参数的构造函数,该构造函数创建的新映射与其参数具有相同的键值映射。实际上,后一个构造函数允许用户复制任何映射,生成所需类的等效映射。没有办法强制执行此建议(因为接口不能包含构造函数),但JDK中的所有通用映射实现都符合此建议。
此接口中包含的“破坏性”方法,即修改其操作的映射的方法,指定在该映射不支持该操作时引发UnsupportedOperationException。如果是这种情况,如果调用对映射没有影响,则这些方法可以(但不是必须)抛出UnsupportedOperationException。例如,如果要“叠加”其映射的映射为空,则在不可修改的 map 上调用putAll(Map)方法可能(但不是必需)引发异常。
一些映射实现对它们可能包含的键和值有限制。例如,有些实现禁止空键和值,有些实现对其键的类型有限制。尝试插入不合格的键或值会引发未经检查的异常,通常为NullPointerException或ClassCastException。尝试查询是否存在不合格的键或值可能会引发异常,或者只返回false;一些实现将展示前一种行为,而一些实现将展现后一种行为。更一般地说,尝试对不合格的键或值执行操作,如果该键或值的完成不会导致将不合格的元素插入到映射中,则可能引发异常,或者可能成功,具体取决于实现。此类异常在该接口规范中标记为“可选”。
集合框架接口中的许多方法都是根据equals方法定义的。例如,containsKey(Object key)方法的规范说:“当且仅当此映射包含键k的映射,使得(key==null?k==null:key.equals(k)),则返回true。”此规范不应被解释为暗示调用映射。具有非空参数键的containsKey将导致键。equals(k)可以为任何键k调用。实现可以自由实现优化,从而避免equals调用,例如,首先比较两个键的哈希代码。(Object.hashCode()规范保证具有不等哈希代码的两个对象不能相等。)更一般地说,各种集合框架接口的实现可以在实现者认为合适的地方自由地利用底层对象方法的指定行为。
执行映射递归遍历的某些映射操作可能会失败,但映射直接或间接包含自身的自引用实例除外。这包括clone()、equals()、hashCode()和toString()方法。实现可以选择性地处理自引用场景,但是大多数当前实现不这样做。