K
- 由此地图维护的键的类型
V
- 映射值的类型
public interface Map<K,V>
这个接口取代了Dictionary类,它是一个完全抽象的类而不是接口。
Map界面提供了三个集合视图 ,允许将映射内容视为一组键,值集合或键值映射集合。 地图的顺序被定义为其中在地图上的集合视图迭代返回元素的顺序。 一些地图实现,如TreeMap课程,对他们的订单做出了具体的保证; 其他人,像HashMap班,不要。
注意:如果使用可变对象作为地图键,必须非常小心。 如果对象的值以影响equals比较的方式更改,而对象是地图中的键,则不会指定地图的行为。 这个禁令的一个特殊情况是,地图不允许将自己包含在内。 虽然地图可以将其本身作为一个值,但建议您非常小心: equals和hashCode方法在这样的地图上已经不太明确。
所有通用映射实现类应提供两个“标准”构造函数:一个创建空映射的void(无参数)构造函数,以及一个具有类型为Map的单个参数的构造函数 ,它创建一个具有相同键值的新映射映射作为参数。 实际上,后一个构造函数允许用户复制任何地图,产生所需类的等效地图。 没有办法强制执行此建议(因为接口不能包含构造函数),而JDK中的所有通用映射实现都符合要求。
包含在该界面中的“破坏性”的方法,即,修改其操作地图的方法,被指定抛出UnsupportedOperationException如果此映射不支持该操作。 如果是这种情况,如果调用对地图没有影响,这些方法可能会但不是必须抛出UnsupportedOperationException 。 例如,如果映射映射为“叠加”的地图为空,则可以在不可修改的映射上调用putAll(Map)
方法,但不是必须抛出异常。
一些地图实现对它们可能包含的键和值有限制。 例如,一些实现禁止空键和值,有些对键的类型有限制。 尝试插入不合格的键或值会抛出未经检查的异常,通常为NullPointerException或ClassCastException 。 尝试查询不合格键或值的存在可能会引发异常,或者可能只是返回false; 一些实现将展现出前者的行为,一些实现将展现出后者。 更一般来说,尝试对不符合条件的密钥或值的操作,其完成不会导致将不合格元素插入到地图中可能会导致异常或可能成功执行该选项。 此异常在此接口的规范中标记为“可选”。
Collections Framework接口中的许多方法都是按照equals
方法定义的。 例如,对于在本说明书containsKey(Object key)
方法表示:“返回true当且仅当此映射包含一个键k使得(key==null ? k==null : key.equals(k))的映射。” 该规范不应该被解释为意味着具有非空参数调用key Map.containsKey会导致key.equals(k)被调用的任意键k。 实现可以实现优化,从而避免equals的调用,例如,首先比较两个密钥的哈希码。 ( Object.hashCode()
规范保证具有不等的哈希码的两个对象不能相等。)更一般地,各种Collections Framework接口的实现可以随意使用底层Object
方法的指定行为,无论执行者认为适当。
执行递归遍历地图的一些地图操作可能会失败,并且地图直接或间接包含自身的自引用实例有异常。 这包括clone()
, equals()
, hashCode()
和toString()
方法。 实现可以可选地处理自引用场景,然而大多数当前实现不这样做。
此接口是成员Java Collections Framework 。
Modifier and Type | Interface and Description |
---|---|
static interface |
Map.Entry<K,V>
地图条目(键值对)。
|
Modifier and Type | Method and Description |
---|---|
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相关联,则将其与给定的非空值相关联。
|
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()
返回此地图中键值映射的数量。
|
Collection<V> |
values()
返回此地图中包含的值的 Collection 视图。
|
int size()
boolean isEmpty()
boolean containsKey(Object key)
key
- 要在此地图中存在的密钥要进行测试
ClassCastException
- 如果密钥对于该地图是不合适的类型(
optional )
NullPointerException
- 如果指定的键为空,并且此映射不允许空键(
optional )
boolean containsValue(Object value)
value
- 要在此地图中存在的值要进行测试
ClassCastException
- 如果该值对于该地图是不合适的类型(
optional )
NullPointerException
- 如果指定的值为空,并且此映射不允许空值(
optional )
V get(Object key)
null
如果此映射包含该键的映射。
更正式地,如果该映射包含从键k
到值v
,使得(key==null ? k==null : key.equals(k))
,则该方法返回v
; 否则返回null
。 (最多可以有一个这样的映射。)
如果此映射允许空值,则返回值null
并不一定表明该映射不包含该键的映射关系; 地图也可能明确地将密钥映射到null
。 可以使用containsKey
操作来区分这两种情况。
key
- 要返回其关联值的键
null
ClassCastException
- 如果密钥是该地图不合适的类型(
optional )
NullPointerException
- 如果指定的键为空,并且此映射不允许空键(
optional )
V put(K key, V value)
key
- 指定值与之关联的键
value
- 与指定键相关联的值
UnsupportedOperationException
-如果
put操作不受此地图支持
ClassCastException
- 如果指定的键或值的类阻止它存储在此映射中
NullPointerException
- 如果指定的键或值为空,并且此映射不允许空值或值
IllegalArgumentException
- 如果指定键或值的某些属性阻止其存储在此映射中
V remove(Object key)
(key==null ? k==null : key.equals(k))
,该映射被去除。
(地图最多可以包含一个这样的映射。)
返回此地图先前相关联的密钥,或null如果映射包含该键的映射值。
如果此映射允许空值,那么null返回值并不一定表明此映射不包含该键的映射关系; 地图也可能显式地将密钥映射到null 。
一旦呼叫返回,该映射将不包含指定键的映射。
key
- 其映射将从地图中删除的密钥
UnsupportedOperationException
-如果
remove操作不受此地图支持
ClassCastException
- 如果密钥对于此地图是不合适的类型(
optional )
NullPointerException
- 如果指定的键为空,并且此映射不允许空键(
optional )
void putAll(Map<? extends K,? extends V> m)
put(k, v)
的效果相当。
如果在操作进行中修改了指定的地图,则此操作的行为是未定义的。
m
- 要存储在此地图中的映射
UnsupportedOperationException
-如果
putAll操作不受此地图支持
ClassCastException
- 如果指定地图中的键或值的类阻止它存储在此映射中
NullPointerException
- 如果指定的地图为空,或者该地图不允许空值或值,并且指定的地图包含空值或值
IllegalArgumentException
- 如果指定地图中的键或值的某些属性阻止其存储在此映射中
void clear()
UnsupportedOperationException
-如果
clear操作不受此地图支持
Set<K> keySet()
Set
视图。
该集合由地图支持,因此对地图的更改将反映在集合中,反之亦然。
如果在集合中的迭代正在进行中修改映射(除了通过迭代器自己的remove操作),迭代的结果是未定义的。
该组支持元件移除,即从映射中相应的映射,经由Iterator.remove,Set.remove,removeAll,retainAll和clear操作。
它不支持add或addAll操作。
Collection<V> values()
Collection
视图。
集合由地图支持,因此对地图的更改将反映在集合中,反之亦然。
如果在集合中的迭代正在进行中修改映射(除了通过迭代器自己的remove操作),迭代的结果是未定义的。
该collection支持元素移除,即从映射中相应的映射,经由Iterator.remove,Collection.remove,removeAll,retainAll和clear操作。
它不支持add或addAll操作。
Set<Map.Entry<K,V>> entrySet()
Set
视图。
该集合由地图支持,因此对地图的更改将反映在集合中,反之亦然。
如果在集合中的迭代正在进行时修改映射(除了通过迭代器自己的remove操作,或者通过迭代器返回的映射条目上的setValue操作),迭代的结果是未定义的。
该组支持元件移除,即从映射中相应的映射,经由Iterator.remove,Set.remove,removeAll,retainAll和clear操作。
它不支持add或addAll操作。
boolean equals(Object o)
equals
在类别
Object
o
- 要与此映射相等的对象进行比较
Object.hashCode()
, HashMap
int hashCode()
Object.hashCode()
的一般合同的要求 。
hashCode
在类别
Object
Map.Entry.hashCode()
,
Object.equals(Object)
,
equals(Object)
default V getOrDefault(Object key, V defaultValue)
defaultValue
如果此映射包含该键的映射。
key
- 要返回其关联值的键
defaultValue
- 键的默认映射
defaultValue
ClassCastException
- 如果密钥是该地图的不当类型(
optional )
NullPointerException
- 如果指定的键为空,并且此映射不允许空键(
optional )
default void forEach(BiConsumer<? super K,? super V> action)
map
:
for (Map.Entry<K, V> entry : map.entrySet()) action.accept(entry.getKey(), entry.getValue());
默认实现不会保证此方法的同步或原子属性。
提供原子性保证的任何实现都必须覆盖此方法并记录其并发属性。
action
- 要为每个条目执行的操作
NullPointerException
- 如果指定的动作为空
ConcurrentModificationException
- 如果在迭代期间发现条目被删除
default void replaceAll(BiFunction<? super K,? super V,? extends V> function)
默认实现相当于,对于这个map
:
for (Map.Entry<K, V> entry : map.entrySet()) entry.setValue(function.apply(entry.getKey(), entry.getValue()));
默认实现不会保证此方法的同步或原子属性。 提供原子性保证的任何实现都必须覆盖此方法并记录其并发属性。
function
- 应用于每个条目的功能
UnsupportedOperationException
-如果
set
操作不受此映射的条目集迭代器的支持。
ClassCastException
- 如果替换值的类阻止它存储在此映射中
NullPointerException
- 如果指定的函数为空,或者指定的替换值为空,并且该映射不允许空值
ClassCastException
- 如果替换值对于该地图是不合适的类型(
optional )
NullPointerException
- 如果函数或替换值为空,并且此映射不允许空值或值(
optional )
IllegalArgumentException
- 如果替换值的某些属性阻止其存储在此映射中(
optional )
ConcurrentModificationException
- 如果在迭代期间发现条目被删除
default V putIfAbsent(K key, V value)
null
)将其与给定值相关联并返回
null
,否则返回当前值。
map
:
V v = map.get(key); if (v == null) v = map.put(key, value); return v;
默认实现不会保证此方法的同步或原子属性。 提供原子性保证的任何实现都必须覆盖此方法并记录其并发属性。
key
- 指定值与之关联的键
value
- 与指定键相关联的值
null
。
(A null
回报还可以表示该映射以前关联null
配钥匙,如果实现支持null值。)
UnsupportedOperationException
-如果
put
操作不受此地图支持(
optional )
ClassCastException
- 如果该地图的键或值不合适(
optional )
NullPointerException
- 如果指定的键或值为空,并且此映射不允许空值或值(
optional )
IllegalArgumentException
- 如果指定键或值的某些属性阻止其存储在此映射中(
optional )
default boolean remove(Object key, Object value)
map
:
if (map.containsKey(key) && Objects.equals(map.get(key), value)) { map.remove(key); return true; } else return false;
默认实现不会保证此方法的同步或原子属性。 提供原子性保证的任何实现都必须覆盖此方法并记录其并发属性。
key
- 与指定值相关联的键
value
- 预期与指定键相关联的值
true
如果该值被删除
UnsupportedOperationException
-如果
remove
操作不受此地图支持(
optional )
ClassCastException
- 如果该地图的键或值不合适(
optional )
NullPointerException
- 如果指定的键或值为空,并且此映射不允许空键或值(
optional )
default boolean replace(K key, V oldValue, V newValue)
map
:
if (map.containsKey(key) && Objects.equals(map.get(key), value)) { map.put(key, newValue); return true; } else return false;
如果oldValue为null,则默认实现不会为不支持空值的映射抛出NullPointerException,除非newValue也为空。
默认实现不会保证此方法的同步或原子属性。 提供原子性保证的任何实现都必须覆盖此方法并记录其并发属性。
key
- 与指定值相关联的键
oldValue
- 预期与指定键相关联的值
newValue
- 与指定键相关联的值
true
如果该值被替换
UnsupportedOperationException
-如果
put
操作不受此地图支持(
optional )
ClassCastException
- 如果指定的键或值的类阻止它存储在此映射中
NullPointerException
- 如果指定的键或newValue为空,并且此映射不允许空值或值
NullPointerException
- 如果oldValue为空,并且此映射不允许空值(
optional )
IllegalArgumentException
- 如果指定键或值的某些属性阻止其存储在此映射中
default V replace(K key, V value)
map
:
if (map.containsKey(key)) { return map.put(key, value); } else return null;
默认实现不会保证此方法的同步或原子属性。 提供原子性保证的任何实现都必须覆盖此方法并记录其并发属性。
key
- 与指定值相关联的键
value
- 与指定键相关联的值
null
。
(A null
返回也可以指示映射先前关联的是null
的密钥,如果实现支持空值)。
UnsupportedOperationException
-如果
put
操作不受此地图支持(
optional )
ClassCastException
- 如果指定的键或值的类阻止它存储在此映射中(
optional )
NullPointerException
- 如果指定的键或值为空,并且此映射不允许空值或值
IllegalArgumentException
- 如果指定键或值的某些属性阻止其存储在此映射中
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);
map
,然后返回当前值或null
如果现在缺席:
if (map.get(key) == null) { V newValue = mappingFunction.apply(key); if (newValue != null) map.put(key, newValue); }
默认实现不会保证此方法的同步或原子属性。 提供原子性保证的任何实现都必须覆盖此方法并记录其并发属性。 特别地,子接口ConcurrentMap
的所有实现必须记录该函数是否仅在原子上应用,只有当该值不存在时。
key
- 指定值与之关联的键
mappingFunction
- 计算值的函数
NullPointerException
- 如果指定的键为空,此映射不支持空键,或者mappingFunction为空
UnsupportedOperationException
-如果
put
操作不受此地图支持(
optional )
ClassCastException
- 如果指定的键或值的类阻止它存储在此映射中(
optional )
default V computeIfPresent(K key, BiFunction<? super K,? super V,? extends V> remappingFunction)
如果函数返回null
,则删除映射。 如果函数本身引发(未检查)异常,则异常被重新引导,并且当前映射保持不变。
map
,然后返回当前值或null
,如果现在不存在:
if (map.get(key) != null) { V oldValue = map.get(key); V newValue = remappingFunction.apply(key, oldValue); if (newValue != null) map.put(key, newValue); else map.remove(key); }
默认实现不会保证此方法的同步或原子属性。 提供原子性保证的任何实现都必须覆盖此方法并记录其并发属性。 特别地,子接口ConcurrentMap
的所有实现必须记录是否只有在该值不存在时才以原子方式应用该功能。
key
- 指定值与之关联的键
remappingFunction
- 计算值的函数
NullPointerException
- 如果指定的键为空,并且此映射不支持空键,或者remappingFunction为空
UnsupportedOperationException
-如果
put
操作不受此地图支持(
optional )
ClassCastException
- 如果指定的键或值的类阻止它存储在此映射中(
optional )
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
,则映射将被删除(如果最初缺少,则保持不存在)。 如果函数本身引发(未检查)异常,则异常被重新引导,并且当前映射保持不变。
map
,然后返回当前值或null
如果缺席:
V oldValue = map.get(key); V newValue = remappingFunction.apply(key, oldValue); if (oldValue != null ) { if (newValue != null) map.put(key, newValue); else map.remove(key); } else { if (newValue != null) map.put(key, newValue); else return null; }
默认实现不会保证此方法的同步或原子属性。 提供原子性保证的任何实现都必须覆盖此方法并记录其并发属性。 特别地,子接口ConcurrentMap
的所有实现必须记录该函数是否仅在原子上被应用,如果该值不存在。
key
- 指定值与之关联的键
remappingFunction
- 计算值的函数
NullPointerException
- 如果指定的键为空,此映射不支持空键,或者remappingFunction为空
UnsupportedOperationException
-如果
put
操作不受此地图支持(
optional )
ClassCastException
- 如果指定的键或值的类阻止它存储在此映射中(
optional )
default V merge(K key, V value, BiFunction<? super V,? super V,? extends V> remappingFunction)
null
。
当组合键的多个映射值时,该方法可能是有用的。
例如,要创建或附加String msg
到值映射:
map.merge(key, msg, String::concat)
如果函数返回null
,则删除映射。 如果函数本身引发(未检查)异常,则异常被重新引导,并且当前映射保持不变。
map
,然后返回当前值或null
如果缺席:
V oldValue = map.get(key); V newValue = (oldValue == null) ? value : remappingFunction.apply(oldValue, value); if (newValue == null) map.remove(key); else map.put(key, newValue);
默认实现不会保证此方法的同步或原子属性。 提供原子性保证的任何实现都必须覆盖此方法并记录其并发属性。 特别地,子接口ConcurrentMap
的所有实现必须记录该函数是否仅在原子上应用,只有当该值不存在时。
key
- 结合值与之关联的键
value
- 要与与密钥相关联的现有值合并的非空值,或者如果没有现有值或空值与密钥相关联,则与该密钥相关联
remappingFunction
- 重新计算值(如果存在)的功能
UnsupportedOperationException
-如果
put
操作不受此地图支持(
optional )
ClassCastException
- 如果指定的键或值的类阻止它存储在此映射中(
optional )
NullPointerException
- 如果指定的键为空,并且此映射不支持空键或值或remappingFunction为空