Map
public interface Map<K,V>
将键映射到值的对象。 map不能包含重复的键; 每个键最多可以映射到一个值。
这个接口代替了 Dictionary 类,它是一个完全抽象的类,而不是一个接口。
Map 接口提供三个集合视图,允许将映射的内容视为一组键、值集合或键值映射集。 map的顺序定义为map集合视图上的迭代器返回其元素的顺序。 一些map实现,如 TreeMap 类,对它们的顺序做出特定的保证; 其他的,比如 HashMap 类,不这样做。
注意:如果将可变对象用作映射键,则必须非常小心。 如果对象的值以影响等于比较的方式更改,而对象是映射中的键,则不指定映射的行为。 此禁令的一个特殊情况是不允许映射包含自己作为键。 虽然允许映射将自身作为值包含在内,但建议格外小心:equals 和 hashCode 方法不再在此类映射上得到很好的定义。
所有通用映射实现类都应该提供两个“标准”构造函数:一个 void(无参数)构造函数,它创建一个空映射,以及一个具有单个 Map 类型参数的构造函数,它创建一个具有相同键值的新映射,映射作为它的参数。 实际上,后一个构造函数允许用户复制任何映射,生成所需类的等效映射。 没有办法强制执行此建议(因为接口不能包含构造函数),但 JDK 中的所有通用映射实现都符合。
此接口中包含的“破坏性”方法,即修改其操作的映射的方法,如果此映射不支持该操作,则指定抛出 UnsupportedOperationException。 如果是这种情况,如果调用对map没有影响,这些方法可能会但不是必须抛出 UnsupportedOperationException。 例如,如果要“叠加”映射的映射为空,则在不可修改的映射上调用 putAll(java.util.Map) 方法可能但不是必须抛出异常。
一些map实现对它们可能包含的键和值有限制。 例如,一些实现禁止空键和值,而一些实现对其键的类型有限制。 尝试插入不合格的键或值会引发未经检查的异常,通常是 NullPointerException 或 ClassCastException。 尝试查询是否存在不合格的键或值可能会引发异常,或者它可能只是返回 false; 一些实现会表现出前一种行为,而另一些会表现出后者。 更一般地,尝试对不合格的键或值进行操作,其完成不会导致将不合格的元素插入到映射中,这可能会引发异常,也可能会成功,这取决于实现的选择。 此类异常在此接口的规范中被标记为“可选”。
Collections Framework 接口中的许多方法都是根据 Object#equals(Object) 方法定义的。 例如, containsKey(Object key) 方法的规范说:“当且仅当此映射包含键 k 的映射时才返回 true 使得 (key==null ? k==null : key.equals(k) )。” 本规范不应被解释为暗示使用非空参数键调用 Map.containsKey 将导致对任何键 k 调用 key.equals(k)。 实现可以自由地实现优化,从而避免调用 equals,例如,首先比较两个键的哈希码。 (Object#hashCode() 规范保证具有不相等哈希码的两个对象不能相等。)更一般地说,各种集合框架接口的实现可以自由地利用底层 Object 方法的指定行为,只要实现者认为它合适 .
一些执行map递归遍历的map操作可能会失败,但map直接或间接包含自身的自引用实例除外。 这包括 clone()、equals()、hashCode() 和 toString() 方法。 实现可以选择处理自引用场景,但是大多数当前的实现不这样做。
此接口是 Java 集合框架的成员。
嵌套类摘要
修饰符和类型 | 接口 | 描述 |
---|---|---|
static interface | Map.Entry<K,V> | 映射条目(键值对)。 |
方法总结
修饰符和类型 | 方法 | 描述 |
---|---|---|
void | clear() | 修饰符和类型从此映射中删除所有映射(可选操作)。 |
default V | compute(K key, BiFunction<? super K,? super V,? extends V> remappingFunction) | 尝试计算指定键及其当前映射值的映射(如果没有当前映射,则为 null)。 |
default V | computeIfAbsent(K key, Function<? super K,? extends V> mappingFunction) | 如果指定的键尚未与值关联(或映射为 null),则尝试使用给定的映射函数计算其值并将其输入到此映射中,除非为 null。 |
default V | computeIfPresent(K key, BiFunction<? super K,? super V,? extends V> remappingFunction) | 如果指定键的值存在且非空,则尝试在给定键及其当前映射值的情况下计算新映射。 |
boolean | containsKey(Object key) | 如果此映射包含指定键的映射,则返回 true。 |
boolean | containsValue(Object value) | 如果此映射将一个或多个键映射到指定值,则返回 true。 |
Set<Map.Entry<K,V>> | entrySet() | 返回此映射中包含的映射的 Set 视图。 |
boolean | equals(Object o) | 比较指定对象与此映射是否相等。 |
default void | forEach(BiConsumer<? super K,? super V> action) | 对该映射中的每个条目执行给定的操作,直到处理完所有条目或该操作引发异常。 |
V | get(Object key) | 返回指定键映射到的值,如果此映射不包含该键的映射,则返回 null。 |
default V | getOrDefault(Object key, V defaultValue) | 返回指定键映射到的值,如果此映射不包含该键的映射,则返回 defaultValue。 |
int | hashCode() | 返回此地图的哈希码值。 |
boolean | isEmpty() | 如果此映射不包含键值映射,则返回 true。 |
Set<K> | keySet() | 返回此映射中包含的键的 Set 视图。 |
default V | merge(K key, V value, BiFunction<? super V,? super V,? extends V> remappingFunction) | 如果指定的键尚未与值关联或与 null 关联,则将其与给定的非 null 值关联。 |
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 boolean | replace(K key, V oldValue, V newValue) | 仅当当前映射到指定值时才替换指定键的条目。 |
default void | replaceAll(BiFunction<? super K,? super V,? extends V> function) | 将每个条目的值替换为对该条目调用给定函数的结果,直到所有条目都已处理或该函数引发异常。 |
int | size() | 返回此映射中键值映射的数量。 |
CollectionV | values() | 返回此映射中包含的值的集合视图。 |
方法详情
size
int size()
返回此映射中键值映射的数量。 如果映射包含多个 Integer.MAX_VALUE 元素,则返回 Integer.MAX_VALUE。
返回:
此映射中的键值映射的数量
isEmpty
boolean isEmpty()
如果此映射不包含键值映射,则返回 true。
返回:
如果此映射不包含键值映射,则为 true
containsKey
boolean containsKey(Object key)
如果此映射包含指定键的映射,则返回 true。 更正式地说,当且仅当此映射包含键 k 的映射时才返回 true,使得 (key==null ? k==null : key.equals(k))。 (最多可以有一个这样的映射。)
参数:
参数名称 | 参数描述 |
---|---|
key | 要测试此map中是否存在的键 |
返回:
如果此映射包含指定键的映射,则为 true
Throws:
Throw名称 | Throw描述 |
---|---|
ClassCastException | 如果此映射的键类型不合适(可选) |
NullPointerException | 如果指定的键为空并且此映射不允许空键(可选) |
containsValue
boolean containsValue(Object value)
如果此映射将一个或多个键映射到指定值,则返回 true。 更正式地说,当且仅当此映射包含至少一个到值 v 的映射时才返回 true,使得 (value==null ? v==null : value.equals(v))。 对于 Map 接口的大多数实现,此操作可能需要映射大小的线性时间。
参数:
参数名称 | 参数描述 |
---|---|
value | 要测试其在此映射中的存在的值 |
返回:
如果此映射将一个或多个键映射到指定值,则为 true
Throws:
Throw名称 | Throw描述 |
---|---|
ClassCastException | 如果该值的类型不适合此map(可选) |
NullPointerException | 如果指定的值为 null 并且此映射不允许 null 值(可选) |
get
V get(Object key)
返回指定键映射到的值,如果此映射不包含该键的映射,则返回 null。
更正式地说,如果此映射包含从键 k 到值 v 的映射,使得 (key==null ? k==null : key.equals(k)),则此方法返回 v; 否则返回null。 (最多可以有一个这样的映射。)
如果此映射允许 null 值,则返回值为 null 并不一定表示该映射不包含该键的映射; 映射也可能将键显式映射为空。 containsKey 操作可用于区分这两种情况。
参数:
参数名称 | 参数描述 |
---|---|
key | 要返回其关联值的键 |
返回:
指定键映射到的值,如果此映射不包含该键的映射,则为 null
Throws:
Throw名称 | Throw描述 |
---|---|
ClassCastException | 如果此映射的键类型不合适(可选) |
NullPointerException | 如果指定的键为空并且此映射不允许空键(可选) |
put
V put(K key, V value)
将指定值与此映射中的指定键关联(可选操作)。 如果映射先前包含键的映射,则旧值将替换为指定值。 (当且仅当 m.containsKey(k) 返回 true 时,映射 m 被称为包含键 k 的映射。)
参数:
参数名称 | 参数描述 |
---|---|
key | 与指定值关联的键 |
value | 与指定键关联的值 |
返回:
与 key 关联的前一个值,如果没有 key 映射,则返回 null。 (如果实现支持空值,则返回空值还可以指示映射先前将空值与键关联。)
Throws:
Throw名称 | Throw描述 |
---|---|
UnsupportedOperationException | 如果此map不支持 put 操作 |
ClassCastException | 如果指定键或值的类阻止它存储在此映射中 |
NullPointerException | 如果指定的键或值是 null 并且此映射不允许 null 键或值 |
IllegalArgumentException | 如果指定键或值的某些属性阻止它存储在此映射中 |
remove
V remove(Object key)
如果存在,则从此映射中删除键的映射(可选操作)。 更正式地说,如果此映射包含从键 k 到值 v 的映射,使得 (key==null ? k==null : key.equals(k)),则删除该映射。 (map最多可以包含一个这样的映射。)
返回此映射先前与键关联的值,如果映射不包含键的映射,则返回 null。
如果此映射允许空值,则返回值 null 不一定表示映射不包含键的映射; map也有可能将键显式映射为空。
一旦调用返回,映射将不包含指定键的映射。
参数:
参数名称 | 参数描述 |
---|---|
key | 要从映射中删除其映射的键 |
返回:
与 key 关联的前一个值,如果没有 key 映射,则返回 null。
Throws:
Throw名称 | Throw描述 |
---|---|
UnsupportedOperationException | 如果此map不支持删除操作 |
ClassCastException | 如果此映射的键类型不合适(可选) |
NullPointerException | 如果指定的键为空并且此映射不允许空键(可选) |
putAll
void putAll(Map<? extends K,? extends V> m)
将所有映射从指定映射复制到此映射(可选操作)。 这个调用的效果等同于对指定映射中从键 k 到值 v 的每个映射调用一次 put(k, v) 在这个映射上的效果。 如果在操作进行时修改了指定的映射,则此操作的行为是未定义的。
参数:
参数名称 | 参数描述 |
---|---|
m | 要存储在此map中的映射 |
Throws:
Throw名称 | Throw描述 |
---|---|
UnsupportedOperationException | 如果此映射不支持 putAll 操作 |
ClassCastException | 如果指定映射中的键或值的类阻止它存储在此映射中 |
NullPointerException | 如果指定的映射为空,或者此映射不允许空键或值,并且指定的映射包含空键或值 |
IllegalArgumentException | 如果指定映射中的键或值的某些属性阻止将其存储在此映射中 |
clear
void clear()
从此映射中删除所有映射(可选操作)。 此调用返回后,map将为空。
Throws:
Throw名称 | Throw描述 |
---|---|
UnsupportedOperationException | 如果此map不支持清除操作 |
keySet
Set<K> keySet()
返回此映射中包含的键的 Set 视图。 集合由map支持,因此对map的更改会反映在集合中,反之亦然。 如果在对集合进行迭代时修改了映射(通过迭代器自己的删除操作除外),则迭代的结果是不确定的。 该集合支持元素移除,即通过 Iterator.remove、Set.remove、removeAll、retainAll 和 clear 操作从映射中移除相应的映射。 它不支持 add 或 addAll 操作。
返回:
此map中包含的键的集合视图
values
CollectionV values()
返回此映射中包含的值的集合视图。 集合由map支持,因此对map的更改会反映在集合中,反之亦然。 如果在对集合进行迭代时修改了映射(通过迭代器自己的删除操作除外),则迭代的结果是不确定的。 该集合支持元素移除,即通过 Iterator.remove、Collection.remove、removeAll、retainAll 和 clear 操作从映射中移除相应的映射。 它不支持 add 或 addAll 操作。
返回:
此map中包含的值的集合视图
entrySet
Set<Map.Entry<K,V>> entrySet()
返回此映射中包含的映射的 Set 视图。 集合由map支持,因此对map的更改会反映在集合中,反之亦然。 如果在对集合进行迭代时修改了映射(除了通过迭代器自己的删除操作,或通过迭代器返回的映射条目上的 setValue 操作),则迭代的结果是未定义的。 该集合支持元素移除,即通过 Iterator.remove、Set.remove、removeAll、retainAll 和 clear 操作从映射中移除相应的映射。 它不支持 add 或 addAll 操作。
返回:
此Map中包含的映射的集合视图
equals
boolean equals(Object o)
比较指定对象与此映射是否相等。 如果给定对象也是一个映射并且两个映射表示相同的映射,则返回 true。 更正式地说,如果 m1.entrySet().equals(m2.entrySet()),则两个映射 m1 和 m2 表示相同的映射。 这确保了 equals 方法在 Map 接口的不同实现中正常工作。
覆盖:
类 Object 中的等于
参数:
参数名称 | 参数描述 |
---|---|
o | 要与此map比较是否相等的对象 |
返回:
如果指定的对象等于此map,则为 true
hashCode
int hashCode()
返回此map的哈希码值。 映射的哈希码定义为映射的 entrySet() 视图中每个条目的哈希码的总和。 这确保了 m1.equals(m2) 意味着 m1.hashCode()==m2.hashCode() 对于任何两个映射 m1 和 m2,如 Object#hashCode 的一般合同所要求的。
覆盖:
类 Object 中的 hashCode
返回:
此map的哈希码值
getOrDefault
default V getOrDefault(Object key, V defaultValue)
返回指定键映射到的值,如果此映射不包含该键的映射,则返回 defaultValue。
参数:
参数名称 | 参数描述 |
---|---|
key | 要返回其关联值的键 |
defaultValue | 键的默认映射 |
返回:
指定键映射到的值,如果此映射不包含该键的映射,则为 defaultValue
Throws:
Throw名称 | Throw描述 |
---|---|
ClassCastException | 如果此映射的键类型不合适(可选) |
NullPointerException | 如果指定的键为空并且此映射不允许空键(可选) |
forEach
default void forEach(BiConsumer<? super K,? super V> action)
对该映射中的每个条目执行给定的操作,直到处理完所有条目或该操作引发异常。 除非实现类另有规定,否则按照条目集迭代的顺序执行动作(如果指定了迭代顺序)。动作抛出的异常将转发给调用者。
参数:
参数名称 | 参数描述 |
---|---|
action | 为每个条目执行的操作 |
Throws:
Throw名称 | Throw描述 |
---|---|
NullPointerException | 如果指定的操作为空 |
ConcurrentModificationException | 如果在迭代过程中发现条目被删除 |
replaceAll
default void replaceAll(BiFunction<? super K,? super V,? extends V> function)
将每个条目的值替换为对该条目调用给定函数的结果,直到所有条目都已处理或该函数引发异常。 函数抛出的异常被转发给调用者。
参数:
参数名称 | 参数描述 |
---|---|
function | 应用于每个条目的函数 |
Throws:
Throw名称 | Throw描述 |
---|---|
UnsupportedOperationException | 如果此映射的条目集合迭代器不支持集合操作。 |
ClassCastException | 如果替换值的类别阻止它存储在此映射中 |
NullPointerException | 如果指定的函数为空,或者指定的替换值为空,并且此映射不允许空值 |
ClassCastException | 如果替换值的类型不适合此映射(可选) |
NullPointerException | 如果函数或替换值为空,并且此映射不允许空键或值(可选) |
IllegalArgumentException | 如果替换值的某些属性阻止它存储在此映射中(可选) |
ConcurrentModificationException | 如果在迭代过程中发现条目被删除 |
putIfAbsent
default V putIfAbsent(K key, V value)
如果指定的键尚未与值关联(或映射到 null),则将其与给定值关联并返回 null,否则返回当前值。
参数:
参数名称 | 参数描述 |
---|---|
key | 与指定值关联的键 |
value | 与指定键关联的值 |
返回:
与指定键关联的前一个值,如果键没有映射,则返回 null。 (如果实现支持 null 值,则返回 null 还可以指示映射先前将 null 与键关联。)
Throws:
Throw名称 | Throw描述 |
---|---|
UnsupportedOperationException | 如果此映射不支持 put 操作(可选) |
ClassCastException | 如果键或值的类型不适合此映射(可选) |
NullPointerException | 如果指定的键或值为空,并且此映射不允许空键或值(可选) |
IllegalArgumentException | 如果指定键或值的某些属性阻止它存储在此映射中(可选) |
remove
default boolean remove(Object key, Object value)
仅当当前映射到指定值时,才删除指定键的条目。
参数:
参数名称 | 参数描述 |
---|---|
key | 与指定值关联的键 |
value | 预期与指定键关联的值 |
返回:
如果值已被删除,则为 true
Throws:
Throw名称 | Throw描述 |
---|---|
UnsupportedOperationException | 如果此map不支持删除操作(可选) |
ClassCastException | 如果键或值的类型不适合此映射(可选) |
NullPointerException | 如果指定的键或值为空,并且此映射不允许空键或值(可选) |
replace
default boolean replace(K key, V oldValue, V newValue)
仅当当前映射到指定值时才替换指定键的条目。
参数:
参数名称 | 参数描述 |
---|---|
key | 与指定值关联的键 |
oldValue | 预期与指定键关联的值 |
newValue | 与指定键关联的值 |
返回:
如果值被替换,则为 true
Throws:
Throw名称 | Throw描述 |
---|---|
UnsupportedOperationException | 如果此映射不支持 put 操作(可选) |
ClassCastException | 如果指定键或值的类阻止它存储在此映射中 |
NullPointerException | 如果指定的键或 newValue 为空,并且此映射不允许空键或值 |
NullPointerException | 如果 oldValue 为 null 并且此映射不允许 null 值(可选) |
IllegalArgumentException | 如果指定键或值的某些属性阻止它存储在此映射中 |
replace
default V replace(K key, V value)
仅当当前映射到某个值时才替换指定键的条目。
参数:
参数名称 | 参数描述 |
---|---|
key | 与指定值关联的键 |
value | 与指定键关联的值 |
返回:
与指定键关联的前一个值,如果键没有映射,则返回 null。 (如果实现支持 null 值,则返回 null 还可以指示映射先前将 null 与键关联。)
Throws:
Throw名称 | Throw描述 |
---|---|
UnsupportedOperationException | 如果此映射不支持 put 操作(可选) |
ClassCastException | 如果指定键或值的类阻止它存储在此映射中(可选) |
NullPointerException | 如果指定的键或值为空,并且此映射不允许空键或值 |
IllegalArgumentException | 如果指定键或值的某些属性阻止它存储在此映射中 |
computeIfAbsent
default V computeIfAbsent(K key, Function<? super K,? extends V> mappingFunction)
如果指定的键尚未与值关联(或映射为 null),则尝试使用给定的映射函数计算其值并将其输入到此映射中,除非为 null。
如果函数返回 null,则不记录映射。 如果函数本身抛出(未经检查的)异常,则重新抛出异常,并且不记录任何映射。 最常见的用法是构造一个新对象作为初始映射值或记忆结果,如下所示:
map.computeIfAbsent(key, k -> new Value(f(k)));
或者实现一个多值映射,Map<K,Collection<V>>,每个键支持多个值:
map.computeIfAbsent(key, k -> new HashSet<V>()).add(v);
参数:
参数名称 | 参数描述 |
---|---|
key | 与指定值关联的键 |
mappingFunction | 计算值的函数 |
返回:
与指定键关联的当前(现有或计算的)值,如果计算的值为 null,则为 null
Throws:
Throw名称 | Throw描述 |
---|---|
NullPointerException | 如果指定键为空且此映射不支持空键,或者mappingFunction 为空 |
UnsupportedOperationException | 如果此映射不支持 put 操作(可选) |
ClassCastException | 如果指定键或值的类阻止它存储在此映射中(可选) |
computeIfPresent
default V computeIfPresent(K key, BiFunction<? super K,? super V,? extends V> remappingFunction)
如果指定键的值存在且非空,则尝试在给定键及其当前映射值的情况下计算新映射。
如果函数返回 null,则删除映射。 如果函数本身抛出(未经检查的)异常,则重新抛出异常,并且当前映射保持不变。
参数:
参数名称 | 参数描述 |
---|---|
key | 与指定值关联的键 |
remappingFunction | 计算值的函数 |
返回:
与指定键关联的新值,如果没有,则为 null
Throws:
Throw名称 | Throw描述 |
---|---|
NullPointerException | 如果指定键为空且此映射不支持空键,或者 remappingFunction 为空 |
UnsupportedOperationException | 如果此映射不支持 put 操作(可选) |
ClassCastException | 如果指定键或值的类阻止它存储在此映射中(可选) |
compute
default V compute(K key, BiFunction<? super K,? super V,? extends V> remappingFunction)
尝试计算指定键及其当前映射值的映射(如果没有当前映射,则为 null)。 例如,要创建或附加 String msg 到值映射:
map.compute(key, (k, v) -> (v == null) ? msg : v.concat(msg))
(方法 merge() 通常更容易用于此类目的。)
如果函数返回 null,则删除映射(如果最初不存在,则保持不存在)。 如果函数本身抛出(未经检查的)异常,则重新抛出异常,并且当前映射保持不变。
参数:
参数名称 | 参数描述 |
---|---|
key | 与指定值关联的键 |
remappingFunction | 计算值的函数 |
返回:
与指定键关联的新值,如果没有,则为 null
Throws:
Throw名称 | Throw描述 |
---|---|
NullPointerException | 如果指定键为空且此映射不支持空键,或者 remappingFunction 为空 |
UnsupportedOperationException | 如果此映射不支持 put 操作(可选) |
ClassCastException | 如果指定键或值的类阻止它存储在此映射中(可选) |
merge
default V merge(K key, V value, BiFunction<? super V,? super V,? extends V> remappingFunction)
如果指定的键尚未与值关联或与 null 关联,则将其与给定的非 null 值关联。 否则,将关联的值替换为给定重映射函数的结果,如果结果为 null,则将其删除。 当为一个键组合多个映射值时,此方法可能很有用。 例如,要创建或附加 String msg 到值映射:
map.merge(key, msg, String::concat)
如果函数返回 null,则删除映射。 如果函数本身抛出(未经检查的)异常,则重新抛出异常,并且当前映射保持不变。
参数:
参数名称 | 参数描述 |
---|---|
key | 与结果值关联的键 |
value | 要与键关联的现有值合并的非空值,或者如果没有现有值或空值与键关联,则与键关联 |
remappingFunction | 重新计算值的函数(如果存在) |
返回:
与指定键关联的新值,如果没有值与该键关联,则为 null
Throws:
Throw名称 | Throw描述 |
---|---|
UnsupportedOperationException | 如果此映射不支持 put 操作(可选) |
ClassCastException | 如果指定键或值的类阻止它存储在此映射中(可选) |
NullPointerException | 如果指定的键为空且此映射不支持空键或值或 remappingFunction 为空 |