public class HashMap
extends AbstractMap<K, V>
implements Map<K, V>, Cloneable, Serializable
java.lang.Object | ||
↳ | java.util.AbstractMap<K, V> | |
↳ | java.util.HashMap<K, V> |
Known Direct Subclasses
LinkedHashMap<K, V>
|
基于哈希表的Map接口的实现。 此实现提供了所有可选映射操作,并允许null值和null密钥。 ( HashMap类大致相当于Hashtable ,除了它是不同步的并且允许空值。)这个类不能保证地图的顺序; 特别是,它不能保证订单会随着时间的推移保持不变。
此实现为基本操作( get和put )提供了恒定时间的性能,假设散列函数将元素在桶中正确分散。 对集合视图的迭代需要的时间与HashMap实例的“容量”(桶的数量)加上其大小(键值映射的数量)成比例。 因此,如果迭代性能很重要,不要将初始容量设置得太高(或者负载因子太低)是非常重要的。
HashMap的实例有两个影响其性能的参数: 初始容量和负载因子 。 容量是哈希表中桶的数量,初始容量就是哈希表创建时的容量。 加载因子是散列表在其容量自动增加之前被允许获得的满量程的度量。 当哈希表中的条目数量超过负载因子和当前容量的乘积时,散列表就会被重新映射 (即重建内部数据结构),以便散列表大约是存储桶数量的两倍。
通常,默认加载因子(.75)在时间和空间成本之间提供了良好的折衷。 较高的值会减少空间开销,但会增加查找成本(反映在HashMap类的大部分操作中,包括get和put )。 在设置初始容量时,应考虑映射中的条目数量及其负载因子,以尽量减少重新运行操作的次数。 如果初始容量大于最大入口数除以负载因子,则不会发生重新刷新操作。
如果许多映射要存储在一个 HashMap实例中,使用足够大的容量创建映射将允许映射存储的效率高于根据需要执行自动重新散列以增大表的大小。
请注意,此实现不同步。 如果多个线程同时访问哈希映射,并且至少有一个线程在结构上修改了映射,则它必须在外部同步。 (结构修改是指添加或删除一个或多个映射的任何操作;仅更改与实例已包含的键相关联的值不是结构修改。)这通常通过同步某个自然封装映射的对象来实现。 如果不存在这样的对象,则应该使用Collections.synchronizedMap
方法“映射”地图。 这最好在创建时完成,以防止意外的不同步访问地图:
Map m = Collections.synchronizedMap(new HashMap(...));
所有这个类的“集合视图方法”返回的迭代器都是快速失败的 :如果在迭代器创建后的任何时候,结构性地修改映射,除了通过迭代器自己的remove方法之外,迭代器将抛出ConcurrentModificationException
。 因此,面对并发修改,迭代器快速而干净地失败,而不是在将来某个未确定的时间冒着任意的,非确定性的行为风险。
请注意,迭代器的故障快速行为无法得到保证,因为一般来说,在存在非同步并发修改的情况下不可能做出任何硬性保证。 失败快速迭代器以尽力而为的方式抛出ConcurrentModificationException 。 因此,编写一个依赖于此异常的程序是正确的: 迭代器的快速失败行为应仅用于检测错误。
本课是 Java Collections Framework的成员。
也可以看看:
Public constructors |
|
---|---|
HashMap(int initialCapacity, float loadFactor) 用指定的初始容量和加载因子构造一个空的 HashMap 。 |
|
HashMap(int initialCapacity) 用指定的初始容量和默认加载因子(0.75)构造一个空的 HashMap 。 |
|
HashMap() 使用默认初始容量(16)和默认加载因子(0.75)构造一个空的 HashMap 。 |
|
HashMap(Map<? extends K, ? extends V> m) 构造一个新 HashMap具有相同的映射关系与指定 Map。 |
Public methods |
|
---|---|
void |
clear() 从此映射中移除所有映射。 |
Object |
clone() 返回此 HashMap实例的浅表副本:键和值本身未被克隆。 |
boolean |
containsKey(Object key) 如果此映射包含指定键的映射,则返回 true 。 |
boolean |
containsValue(Object value) 如果此映射将一个或多个键映射到指定值,则返回 true 。 |
Set<Entry<K, V>> |
entrySet() 返回此映射中包含的映射的 |
void |
forEach(BiConsumer<? super K, ? super V> action) 对此映射中的每个条目执行给定操作,直到处理完所有条目或操作抛出异常为止。 |
V |
get(Object key) 返回指定键映射到的值,或者如果此映射不包含键映射,则返回 |
boolean |
isEmpty() 如果此映射不包含键 - 值映射,则返回 true 。 |
Set<K> |
keySet() 返回包含在此映射中的键的 |
V |
put(K key, V value) 将指定的值与此映射中指定的键关联。 |
void |
putAll(Map<? extends K, ? extends V> m) 将指定地图中的所有映射复制到此地图。 |
V |
remove(Object key) 如果存在,则从该映射中删除指定键的映射。 |
boolean |
replace(K key, V oldValue, V newValue) 仅当当前映射到指定值时才替换指定键的条目。 |
void |
replaceAll(BiFunction<? super K, ? super V, ? extends V> function) 用对该条目调用给定函数的结果替换每个条目的值,直到处理完所有条目或者该函数抛出异常。 |
int |
size() 返回此映射中键 - 值映射的数量。 |
Collection<V> |
values() 返回此映射中包含的值的 |
Inherited methods |
|
---|---|
From class java.util.AbstractMap
|
|
From class java.lang.Object
|
|
From interface java.util.Map
|
HashMap (int initialCapacity, float loadFactor)
用指定的初始容量和加载因子构造一个空的 HashMap 。
Parameters | |
---|---|
initialCapacity |
int : the initial capacity |
loadFactor |
float : the load factor |
Throws | |
---|---|
IllegalArgumentException |
if the initial capacity is negative or the load factor is nonpositive |
HashMap (int initialCapacity)
用指定的初始容量和默认加载因子(0.75)构造一个空的 HashMap 。
Parameters | |
---|---|
initialCapacity |
int : the initial capacity. |
Throws | |
---|---|
IllegalArgumentException |
if the initial capacity is negative. |
HashMap (Map<? extends K, ? extends V> m)
构造一个新HashMap具有相同的映射关系与指定Map。 HashMap使用默认加载因子(0.75)和足以容纳指定Map中的映射的初始容量创建 。
Parameters | |
---|---|
m |
Map : the map whose mappings are to be placed in this map |
Throws | |
---|---|
NullPointerException |
if the specified map is null |
Object clone ()
返回此 HashMap实例的浅表副本:键和值本身未被克隆。
Returns | |
---|---|
Object |
a shallow copy of this map |
boolean containsKey (Object key)
如果此映射包含指定键的映射,则返回 true 。
Parameters | |
---|---|
key |
Object : The key whose presence in this map is to be tested |
Returns | |
---|---|
boolean |
true if this map contains a mapping for the specified key. |
boolean containsValue (Object value)
如果此映射将一个或多个键映射到指定值,则返回 true 。
Parameters | |
---|---|
value |
Object : value whose presence in this map is to be tested |
Returns | |
---|---|
boolean |
true if this map maps one or more keys to the specified value |
Set<Entry<K, V>> entrySet ()
返回此映射中包含的映射的Set
视图。 该集合由地图支持,因此对地图的更改反映在集合中,反之亦然。 如果在对集合进行迭代的过程中修改映射(除了通过迭代器自己的remove操作或通过对迭代器返回的映射条目执行setValue操作),迭代的结果是未定义的。 该组支持元件移除,即从映射中相应的映射,经由Iterator.remove,Set.remove,removeAll,retainAll clear和操作。 它不支持add或addAll操作。
Returns | |
---|---|
Set<Entry<K, V>> |
a set view of the mappings contained in this map |
void forEach (BiConsumer<? super K, ? super V> action)
对此映射中的每个条目执行给定操作,直到处理完所有条目或操作抛出异常为止。 除非实现类另有规定,否则按照条目集迭代的顺序执行操作(如果指定了迭代顺序)。操作抛出的异常会中继给调用者。
Parameters | |
---|---|
action |
BiConsumer : The action to be performed for each entry |
V get (Object key)
返回指定键映射到的值,或者如果此映射不包含键映射,则返回 null
。
更正式地说,如果该映射包含从键k
到值v
的映射,例如(key==null ? k==null : key.equals(k))
,则该方法返回v
; 否则返回null
。 (最多可以有一个这样的映射。)
返回值null
不一定表示映射不包含该键的映射; 地图也可能明确将密钥映射到null
。 containsKey
操作可用于区分这两种情况。
Parameters | |
---|---|
key |
Object : the key whose associated value is to be returned |
Returns | |
---|---|
V |
the value to which the specified key is mapped, or null if this map contains no mapping for the key |
也可以看看:
boolean isEmpty ()
如果此映射不包含键 - 值映射,则返回 true 。
Returns | |
---|---|
boolean |
true if this map contains no key-value mappings |
Set<K> keySet ()
返回此映射中包含的键的Set
视图。 该集合由地图支持,因此对地图的更改反映在集合中,反之亦然。 如果在对集合进行迭代时修改了映射(除了通过迭代器自己的remove操作),迭代的结果是未定义的。 该组支持元件移除,即从映射中相应的映射,经由Iterator.remove,Set.remove,removeAll,retainAll,和clear操作。 它不支持add或addAll操作。
Returns | |
---|---|
Set<K> |
a set view of the keys contained in this map |
V put (K key, V value)
将指定的值与此映射中指定的键关联。 如果地图先前包含密钥的映射,则旧值将被替换。
Parameters | |
---|---|
key |
K : key with which the specified value is to be associated |
value |
V : value to be associated with the specified key |
Returns | |
---|---|
V |
the previous value associated with key, or null if there was no mapping for key. (A null return can also indicate that the map previously associated null with key.) |
void putAll (Map<? extends K, ? extends V> m)
将指定地图中的所有映射复制到此地图。 这些映射将替换此映射对当前指定映射中的任何键的任何映射。
Parameters | |
---|---|
m |
Map : mappings to be stored in this map |
Throws | |
---|---|
NullPointerException |
if the specified map is null |
V remove (Object key)
如果存在,则从该映射中删除指定键的映射。
Parameters | |
---|---|
key |
Object : key whose mapping is to be removed from the map |
Returns | |
---|---|
V |
the previous value associated with key, or null if there was no mapping for key. (A null return can also indicate that the map previously associated null with key.) |
boolean replace (K key, V oldValue, V newValue)
仅当当前映射到指定值时才替换指定键的条目。
Parameters | |
---|---|
key |
K : key with which the specified value is associated |
oldValue |
V : value expected to be associated with the specified key |
newValue |
V : value to be associated with the specified key |
Returns | |
---|---|
boolean |
true if the value was replaced |
void replaceAll (BiFunction<? super K, ? super V, ? extends V> function)
用对该条目调用给定函数的结果替换每个条目的值,直到处理完所有条目或者该函数抛出异常。 函数抛出的异常会传递给调用者。
Parameters | |
---|---|
function |
BiFunction : the function to apply to each entry |
int size ()
返回此映射中键 - 值映射的数量。
Returns | |
---|---|
int |
the number of key-value mappings in this map |
Collection<V> values ()
返回此映射中包含的值的Collection
视图。 该集合由地图支持,因此地图的更改会反映在集合中,反之亦然。 如果在对集合进行迭代时修改了映射(除了通过迭代器自己的remove操作),迭代的结果是未定义的。 该collection支持元素移除,即从映射中相应的映射,经由Iterator.remove,Collection.remove,removeAll,retainAll clear和操作。 它不支持add或addAll操作。
Returns | |
---|---|
Collection<V> |
a collection view of the values contained in this map |