此类提供
Map
接口的骨干实现,以最大限度地减少实现此接口所需的工作。
要实现不可修改的映射,编程人员只需扩展此类并提供
entrySet
方法的实现即可,该方法将返回映射的映射关系 set 视图。通常,返回的 set 将依次在
AbstractSet
上实现。此 set 不支持
add
或
remove
方法,其迭代器也不支持
remove
方法。
要实现可修改的映射,编程人员必须另外重写此类的
put
方法(否则将抛出
UnsupportedOperationException
),
entrySet().iterator()
返回的迭代器也必须另外实现其
remove
方法。
按照
Map
接口规范中的建议,编程人员通常应该提供一个 void(无参数)构造方法和 map 构造方法。
此类中每个非抽象方法的文档详细描述了其实现。如果要实现的映射允许更有效的实现,则可以重写所有这些方法。
此类是
Java Collections Framework
的成员。
public int
size
()
返回此映射中的键-值映射关系数。如果该映射包含的元素大于
Integer.MAX_VALUE
,则返回
Integer.MAX_VALUE
。
此实现返回
entrySet().size()
。
指定者:
接口
Map
<
K
,
V
>
中的
size
返回:
此映射中的键-值映射关系数
public boolean
containsValue
(
Object
value)
如果此映射将一个或多个键映射到指定值,则返回
true
。更确切地讲,当且仅当此映射至少包含一个对满足
(value==null ? v==null : value.equals(v))
的值
v
的映射关系时,返回
true
。对于大多数
Map
接口的实现而言,此操作需要的时间可能与映射大小呈线性关系。
此实现在 entrySet() 上进行迭代,以搜索带有指定值的条目。如果找到这样的条目,则返回
true
。如果迭代终止,并且没有找到这样的条目,则返回
false
。注意,此实现所需的时间与映射的大小呈线性关系。
指定者:
接口
Map
<
K
,
V
>
中的
containsValue
参数:
value
- 测试是否存在于此映射中的值
返回:
如果此映射将一个或多个键映射到指定值,则返回
true
ClassCastException
- 如果该值对于此映射是不合适的类型(可选)
NullPointerException
- 如果指定值为 null 并且此映射不允许 null 值(可选)
public boolean
containsKey
(
Object
key)
如果此映射包含指定键的映射关系,则返回
true
。更确切地讲,当且仅当此映射包含针对满足
(key==null ? k==null : key.equals(k))
的键
k
的映射关系时,返回
true
。(最多只能有一个这样的映射关系)。
此实现在
entrySet()
上进行迭代,以搜索带有指定键的条目。如果找到这样的条目,则返回
true
。如果迭代终止,并且没有找到这样的条目,则返回
false
。注意,此实现所需的时间与映射的大小呈线性关系;许多实现将重写此方法。
指定者:
接口
Map
<
K
,
V
>
中的
containsKey
参数:
key
- 测试是否存在于此映射中的键
返回:
如果此映射包含指定键的映射关系,则返回
true
ClassCastException
- 如果该键对于此映射是不合适的类型(可选)
NullPointerException
- 如果指定键为 null 并且此映射不允许 null 键(可选)
更确切地讲,如果此映射包含满足
(key==null ? k==null :
key.equals(k))
的键
k
到值
v
的映射关系,则此方法返回
v
;否则返回
null
。(最多只能有一个这样的映射关系)。
如果此映射允许 null 值,则返回
null
值并不
一定
表示该映射不包含该键的映射关系;也可能该映射将该键显示地映射到
null
。使用
containsKey
操作可区分这两种情况。
此实现在
entrySet()
上进行迭代,以搜索带有指定键的条目。如果找到这样的条目,则返回该条目的值。如果迭代终止,并且没有找到这样的条目,则返回
null
。注意,此实现所需的时间与映射的大小呈线性关系;许多实现将重写此方法。
指定者:
接口
Map
<
K
,
V
>
中的
get
参数:
key
- 要返回其关联值的键
返回:
指定键所映射的值;如果此映射不包含该键的映射关系,则返回
null
ClassCastException
- 如果该键对于此映射是不合适的类型(可选)
NullPointerException
- 如果指定键为 null 并且此映射不允许 null 键(可选)
V
value)
将指定的值与此映射中的指定键关联(可选操作)。如果此映射以前包含一个该键的映射关系,则用指定值替换旧值(当且仅当
m.containsKey(k)
返回
true
时,才能说映射
m
包含键
k
的映射关系)。
此实现始终抛出
UnsupportedOperationException
。
指定者:
接口
Map
<
K
,
V
>
中的
put
参数:
key
- 与指定值关联的键
value
- 与指定键关联的值
返回:
以前与
key
关联的值,如果没有针对
key
的映射关系,则返回
null
。(如果该实现支持
null
值,则返回
null
也可能表示此映射以前将
null
与
key
关联)。
UnsupportedOperationException
- 如果此映射不支持
put
操作
ClassCastException
- 如果指定键或值的类不允许将其存储在此映射中
NullPointerException
- 如果指定键或值为 null,并且此映射不允许 null 键或值
IllegalArgumentException
- 如果指定键或值的某些属性不允许将其存储在此映射中
public
V
remove
(
Object
key)
如果存在一个键的映射关系,则将其从此映射中移除(可选操作)。更确切地讲,如果此映射包含从满足
(key==null ? k==null :key.equals(k))
的键
k
到值
v
的映射关系,则移除该映射关系。(该映射最多只能包含一个这样的映射关系。)
返回此映射中以前关联该键的值,如果此映射不包含该键的映射关系,则返回
null
。
如果此映射允许 null 值,则返回
null
值并不
一定
表示该映射不包含该键的映射关系;也可能该映射将该键显示地映射到
null
。
调用返回后,此映射将不再包含指定键的映射关系。
此实现在
entrySet()
上进行迭代,以搜索带有指定键的条目。如果找到这样的条目,则通过
getValue
操作获取该条目的值,然后使用迭代器的
remove
操作从 collection(以及底层实现映射)中移除该条目,并返回保存的值。如果迭代终止,并且没有找到这样的条目,则返回
null
。注意,此实现所需的时间与映射大小呈线性关系;许多实现将重写此方法。
注意,如果
entrySet
迭代器不支持
remove
方法,并且此映射包含指定键的映射关系,则此实现将抛出
UnsupportedOperationException
。
指定者:
接口
Map
<
K
,
V
>
中的
remove
参数:
key
- 从映射中移除其映射关系的键
返回:
以前与
key
关联的值;如果没有
key
的映射关系,则返回
null
。
UnsupportedOperationException
- 如果此映射不支持
remove
操作
ClassCastException
- 如果该键对于此映射是不合适的类型(可选)
NullPointerException
- 如果指定键为 null 并且此映射不允许 null 键(可选)
public void
putAll
(
Map
<? extends
K
,? extends
V
> m)
从指定映射中将所有映射关系复制到此映射中(可选操作)。对于指定映射中的每个键
k
到值
v
的映射关系,此调用等效于对此映射调用一次
put(k, v)
。如果正在进行此操作的同时修改了指定的映射,则此操作的行为是不确定的。
此实现在指定映射的
entrySet()
collection 上进行迭代,并对迭代返回的每个条目调用一次此映射的
put
操作。
注意,如果此映射不支持
put
操作,并且指定映射为非空,则此实现将抛出
UnsupportedOperationException
。
指定者:
接口
Map
<
K
,
V
>
中的
putAll
参数:
m
- 要存储在此映射中的映射关系
UnsupportedOperationException
- 如果此映射不支持
putAll
操作
ClassCastException
- 如果指定映射中的键或值的类不允许将其存储在此映射中
NullPointerException
- 如果指定映射为 null,或者此映射不允许 null 键或值,并且指定的映射包含 null 键或值
IllegalArgumentException
- 如果指定映射中的键或值的某些属性不允许将其存储在此映射中
此实现调用
entrySet().clear()
。
注意,如果
entrySet
不支持
clear
操作,则此实现将抛出
UnsupportedOperationException
。
指定者:
接口
Map
<
K
,
V
>
中的
clear
UnsupportedOperationException
- 如果此映射不支持
clear
操作
public
Set
<
K
>
keySet
()
返回此映射中包含的键的
Set
视图。该 set 受映射支持,所以对映射的更改可在此 set 中反映出来,反之亦然。如果对该 set 进行迭代的同时修改了映射(通过迭代器自己的
remove
操作除外),则迭代结果是不确定的。set 支持元素移除,通过
Iterator.remove
、
Set.remove
、
removeAll
、
retainAll
和
clear
操作可从映射中移除相应的映射关系。它不支持
add
或
addAll
操作。
此实现返回一个子类化
AbstractSet
的 set。子类的 iterator 方法通过此映射的
entrySet()
迭代器返回一个“包装器对象”。
size
方法委托给此映射的
size
方法,
contains
方法委托给此映射的
containsKey
方法。
set 是在第一次调用此方法时创建的,并为响应所有后续调用而返回。 因为不执行同步操作,所以对此方法的多个调用几乎总是返回相同的 set。
指定者:
接口
Map
<
K
,
V
>
中的
keySet
返回:
此映射中包含的键的 set 视图
public
Collection
<
V
>
values
()
返回此映射中包含的值的
Collection
视图。该 collection 受映射支持,所以对映射的更改可在此 collection 中反映出来,反之亦然。如果对该 collection 进行迭代的同时修改了映射(通过迭代器自己的
remove
操作除外),则迭代结果是不确定的。collection 支持元素移除,通过
Iterator.remove
、
Collection.remove
、
removeAll
、
retainAll
和
clear
操作可从映射中移除相应的映射关系。它不支持
add
或
addAll
操作。
此实现返回一个子类化
AbstractCollection
的 collection。子类的 iterator 方法通过此映射的
entrySet()
迭代器返回一个“包装器对象”。
size
方法委托给此映射的
size
方法,
contains
方法委托给此映射的
containsValue
方法。
collection 是在第一次调用此方法时创建的,并为响应所有后续调用而返回。因为不执行同步操作,所以对此方法的多个调用几乎总是返回相同的 collection。
指定者:
接口
Map
<
K
,
V
>
中的
values
返回:
此映射中包含的值的 collection 视图
从接口
Map
复制的描述
返回此映射中包含的映射关系的
Set
视图。该 set 受映射支持,所以对映射的更改可在此 set 中反映出来,反之亦然。如果对该 set 进行迭代的同时修改了映射(通过迭代器自己的
remove
操作,或者通过对迭代器返回的映射项执行
setValue
操作除外),则迭代结果是不确定的。set 支持元素移除,通过
Iterator.remove
、
Set.remove
、
removeAll
、
retainAll
和
clear
操作可从映射中移除相应的映射关系。它不支持
add
或
addAll
操作。
指定者:
接口
Map
<
K
,
V
>
中的
entrySet
返回:
此映射中包含的映射关系的 set 视图
public boolean
equals
(
Object
o)
比较指定对象与此映射的相等性。如果给定对象也是一个映射并且两个映射表示相同的映射关系,则返回
true
。更确切地讲,如果
m1.entrySet().equals(m2.entrySet())
,则两个映射
m1
和
m2
表示相同的映射关系。这可以确保
equals
方法在
Map
接口的不同实现中正常工作。
此实现首先检查指定的对象是否为此映射;如果是,则返回
true
。然后,它将检查指定的对象是否是一个大小与此映射相等的映射;如果不是,则返回
false
。如果是,则在此映射的
entrySet
collection 上进行迭代,并检查指定的映射是否包含此映射所包含的每个映射关系。如果指定的映射中不包含这样的映射关系,则返回
false
。如果迭代完成,则返回
true
。
指定者:
接口
Map
<
K
,
V
>
中的
equals
覆盖:
类
Object
中的
equals
参数:
o
- 要与此映射进行相等性比较的对象
返回:
如果指定的对象等于此映射,则返回
true
另请参见:
Object.hashCode()
,
Hashtable
public int
hashCode
()
返回此映射的哈希码值。映射的哈希码被定义为该映射的
entrySet()
视图中每个条目的哈希码之和。这确保了
m1.equals(t2)
对于任意两个映射
m1
和
m2
都意味着
m1.hashCode()==m2.hashCode()
,正如
Object.hashCode()
的常规协定所要求的。
此实现在
entrySet()
上进行迭代,对 set 中的每个元素(条目)调用
hashCode()
,并合计结果。
指定者:
接口
Map
<
K
,
V
>
中的
hashCode
覆盖:
类
Object
中的
hashCode
返回:
此映射的哈希码值。
另请参见:
Map.Entry.hashCode()
,
Object.equals(Object)
,
Set.equals(Object)
public
String
toString
()
返回此映射的字符串表示形式。该字符串表示形式由键-值映射关系列表组成,按照该映射
entrySet
视图的迭代器返回的顺序排列,并用括号 (
"{}"
) 括起来。相邻的映射关系是用字符
", "
(逗号加空格)分隔的。每个键-值映射关系按以下方式呈现:键,后面是一个等号 (
"="
),再后面是关联的值。键和值都通过
String.valueOf(Object)
转换为字符串。
覆盖:
类
Object
中的
toString
返回:
此映射的字符串表示形式。