java 集合之Interface Map<K,V>
-
类型参数:K- 此映射所维护的键的类型;V- 映射值的类型
-
将键映射到值的对象。 一个映射不能包含重复的键; 每个键最多可以映射到一个值。这个接口取代了 Dictionary 类,后者是一个完全抽象的类而不是一个接口。
-
Map 接口提供了三个 collection 视图,允许以键集、值集或键-值映射关系集的形式查看某个映射的内容。 映射的顺序定义为映射的 collection 视图上的迭代器返回其元素的顺序。 某些映射实现可明确保证其顺序,如
TreeMap
类;另一些映射实现则不保证顺序,如HashMap
类。 -
注意:如果将可变对象用作映射键,则必须非常小心。当对象是映射中某个键时,如果以影响
equals
比较的方式更改了对象的值,则映射的行为将是不确定的。 此项禁止的一种特殊情况是不允许映射将自身作为键包含。 虽然允许映射将自身包含为值,但建议格外小心:在这样的映射上equals
和hashCode
方法的定义将不再是明确的。 -
所有通用映射实现类都应该提供两个“标准”构造函数:一个 void(无参数)构造函数,它创建一个空映射,以及一个带有 Map 类型的单个参数的构造函数,它创建一个具有相同键值的新映射 映射作为其参数。 实际上,后一个构造函数允许用户复制任何映射,生成所需类的等效映射。 没有办法强制执行此建议(因为接口不能包含构造函数),但 JDK 中的所有通用映射实现都符合。
-
此接口中包含的“破坏性”方法,即修改它们操作的映射的方法,如果此映射不支持该操作,则指定为抛出 UnsupportedOperationException。 在这种情况下,如果调用对地图没有影响,则这些方法可能(但不是必需)抛出 UnsupportedOperationException。 例如,如果要“叠加”映射的映射为空,则在不可修改的映射上调用 putAll(Map) 方法可能(但不是必需)引发异常。
-
一些地图实现对它们可能包含的键和值有限制。 例如,有些实现禁止空键和值,有些实现对其键的类型有限制。
- 尝试插入不合格的键或值会引发未经检查的异常,通常为 NullPointerException 或 ClassCastException。
- 尝试查询不合格的键或值的存在可能会引发异常,或者它可能只是返回 false
- 更一般地,尝试对不合格的键或值执行操作,其完成不会导致不合格的元素插入到映射中,可能会引发异常,也可能会成功,具体取决于实现的选择。 在此接口的规范中,此类异常被标记为“可选”。
-
Collections Framework 接口中的许多方法都是根据 equals 方法定义的。
- 例如, containsKey(Object key) 方法的规范说:“当且仅当此映射包含键 k 的映射使得
(key==null ? k==null : key.equals(k) )
” 本规范不应被解释为暗示使用非空参数键调用 Map.containsKey 将导致为任何键 k 调用 key.equals(k)。 - 实现可以自由地实现优化,从而避免 equals 调用,例如,通过首先比较两个键的哈希码。 (Object.hashCode() 规范保证哈希码不相等的两个对象不能相等)更一般地说,各种集合框架接口的实现可以自由地利用底层对象方法的指定行为,只要实现者认为合适 .
- 例如, containsKey(Object key) 方法的规范说:“当且仅当此映射包含键 k 的映射使得
-
某些执行映射递归遍历的映射操作可能会失败,但映射直接或间接包含自身的自引用实例除外。 这包括 clone()、equals()、hashCode() 和 toString() 方法。 实现可以选择性地处理自引用场景,但是大多数当前的实现都没有这样做。
-
Map.of、Map.ofEntries 和 Map.copyOf 静态工厂方法提供了一种创建不可修改映射的便捷方法。 这些方法创建的 Map 实例具有以下特点:
-
它们是不可修改的。 不能添加、删除或更新键和值。 调用 Map 上的任何 mutator 方法将始终导致抛出 UnsupportedOperationException。 但是,如果包含的键或值本身是可变的,这可能会导致 Map 行为不一致或其内容似乎发生变化。
-
它们不允许空键和值。 尝试使用空键或值创建它们会导致 NullPointerException。
-
如果所有键和值都是可序列化的,则它们是可序列化的。
-
他们在创建时拒绝重复的键。 传递给静态工厂方法的重复键会导致 IllegalArgumentException。
-
映射的迭代顺序未指定并且可能会发生变化。
-
它们是基于价值的。 程序员应将相等的实例视为可互换的,不应将它们用于同步,否则可能会出现不可预测的行为。 例如,在未来的版本中,同步可能会失败。 调用者不应假设返回实例的身份。 工厂可以自由地创建新实例或重用现有实例。
-
它们按照“序列化表单”页面上的指定进行序列化。
-
嵌套类摘要:static interface Map.Entry<K,V>,映射项(键-值对)。
方法
Modifier and Type | Method | Description |
---|---|---|
void | clear() | 从此映射中删除所有映射(可选操作)。 |
boolean | containsKey(Object key) | 如果此映射包含指定键的映射,则返回 true。 |
boolean | containsValue(Object value) | 如果此映射将一个或多个键映射到指定值,则返回 true。 |
static <K, V> Map<K, V> | copyOf(Map<? extends K, ? extends V> map) | 返回一个不可修改的 Map,其中包含给定 Map 的条目。 |
static <K, V> Map.Entry<K, V> | entry(K k, V v) 返 | 回包含给定键和值的不可修改 Map.Entry。Set<Map.Entry<K, V>> |
boolean | equals(Object o) | 比较指定的对象与此映射是否相等。 |
default void | forEach(BiConsumer<? super K, ? super V> action) | 为此映射中的每个条目执行给定的操作,直到处理完所有条目或该操作引发异常。 |
V | get(Object key) | 返回指定键映射到的值,如果此映射不包含该键的映射,则返回 null。 default V |
int | hashCode() | 返回此映射的哈希代码值。 |
boolean | isEmpty() | 如果此映射不包含键值映射,则返回 true。 |
Set | keySet() | 返回此映射中包含的键的 Set 视图。 |
static <K, V> Map<K, V> | of() | 返回包含零映射的不可修改映射。 |
static <K, V> Map<K, V> | of(K k1, V v1, K k2, V v2) {1~10个} |
返回包含{1~10}个映射的不可修改映射。 |
V | put(K key, V value) | 将指定值与此映射中的指定键关联(可选操作)。 |
void | putAll(Map<? extends K, ? extends V> m) | 将所有映射从指定映射复制到此映射(可选操作)。 |
default V | putIfAbsent(K key, V value) | 如果指定的键尚未与值关联(或映射为 null),则将其与给定值关联并返回 null,否则返回当前值。 |
V | remove(Object key) | 从此映射中删除键的映射(如果存在)(可选操作)。 |
default boolean | remove(Object key, Object value) | 仅当指定键当前映射到指定值时,才删除指定键的条目。 |
default V | replace(K key, V value) | 仅当当前映射到某个值时才替换指定键的条目。 |
default void | replaceAll(BiFunction<? super K, ? super V, ? extends V> function) | 将每个条目的值替换为对该条目调用给定函数的结果,直到处理完所有条目或该函数抛出异常 . |
default boolean | replace(K key, V oldValue, V newValue) | 仅当当前映射到指定值时才替换指定键的条目。 |
int |