Most visited

Recently visited

Added in API level 1

HashMap

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


基于哈希表的Map接口的实现。 此实现提供了所有可选映射操作,并允许null值和null密钥。 HashMap类大致相当于Hashtable ,除了它是不同步的并且允许空值。)这个类不能保证地图的顺序; 特别是,它不能保证订单会随着时间的推移保持不变。

此实现为基本操作( getput )提供了恒定时间的性能,假设散列函数将元素在桶中正确分散。 对集合视图的迭代需要的时间与HashMap实例的“容量”(桶的数量)加上其大小(键值映射的数量)成比例。 因此,如果迭代性能很重要,不要将初始容量设置得太高(或者负载因子太低)是非常重要的。

HashMap的实例有两个影响其性能的参数: 初始容量负载因子 容量是哈希表中桶的数量,初始容量就是哈希表创建时的容量。 加载因子是散列表在其容量自动增加之前被允许获得的满量程的度量。 当哈希表中的条目数量超过负载因子和当前容量的乘积时,散列表就会被重新映射 (即重建内部数据结构),以便散列表大约是存储桶数量的两倍。

通常,默认加载因子(.75)在时间和空间成本之间提供了良好的折衷。 较高的值会减少空间开销,但会增加查找成本(反映在HashMap类的大部分操作中,包括getput )。 在设置初始容量时,应考虑映射中的条目数量及其负载因子,以尽量减少重新运行操作的次数。 如果初始容量大于最大入口数除以负载因子,则不会发生重新刷新操作。

如果许多映射要存储在一个 HashMap实例中,使用足够大的容量创建映射将允许映射存储的效率高于根据需要执行自动重新散列以增大表的大小。

请注意,此实现不同步。 如果多个线程同时访问哈希映射,并且至少有一个线程在结构上修改了映射,则它必须在外部同步。 (结构修改是指添加或删除一个或多个映射的任何操作;仅更改与实例已包含的键相关联的值不是结构修改。)这通常通过同步某个自然封装映射的对象来实现。 如果不存在这样的对象,则应该使用Collections.synchronizedMap方法“映射”地图。 这最好在创建时完成,以防止意外的不同步访问地图:

   Map m = Collections.synchronizedMap(new HashMap(...));

所有这个类的“集合视图方法”返回的迭代器都是快速失败的 :如果在迭代器创建后的任何时候,结构性地修改映射,除了通过迭代器自己的remove方法之外,迭代器将抛出ConcurrentModificationException 因此,面对并发修改,迭代器快速而干净地失败,而不是在将来某个未确定的时间冒着任意的,非确定性的行为风险。

请注意,迭代器的故障快速行为无法得到保证,因为一般来说,在存在非同步并发修改的情况下不可能做出任何硬性保证。 失败快速迭代器以尽力而为的方式抛出ConcurrentModificationException 因此,编写一个依赖于此异常的程序是正确的: 迭代器的快速失败行为应仅用于检测错误。

本课是 Java Collections Framework的成员。

也可以看看:

Summary

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()

返回此映射中包含的映射的 Set视图。

void forEach(BiConsumer<? super K, ? super V> action)

对此映射中的每个条目执行给定操作,直到处理完所有条目或操作抛出异常为止。

V get(Object key)

返回指定键映射到的值,或者如果此映射不包含键映射,则返回 null

boolean isEmpty()

如果此映射不包含键 - 值映射,则返回 true

Set<K> keySet()

返回包含在此映射中的键的 Set视图。

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()

返回此映射中包含的值的 Collection视图。

Inherited methods

From class java.util.AbstractMap
From class java.lang.Object
From interface java.util.Map

Public constructors

HashMap

Added in API level 1
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

Added in API level 1
HashMap (int initialCapacity)

用指定的初始容量和默认加载因子(0.75)构造一个空的 HashMap

Parameters
initialCapacity int: the initial capacity.
Throws
IllegalArgumentException if the initial capacity is negative.

HashMap

Added in API level 1
HashMap ()

使用默认初始容量(16)和默认加载因子(0.75)构造一个空的 HashMap

HashMap

Added in API level 1
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

Public methods

clear

Added in API level 1
void clear ()

从此映射中移除所有映射。 此通话返回后,地图将为空。

clone

Added in API level 1
Object clone ()

返回此 HashMap实例的浅表副本:键和值本身未被克隆。

Returns
Object a shallow copy of this map

containsKey

Added in API level 1
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.

containsValue

Added in API level 1
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

entrySet

Added in API level 1
Set<Entry<K, V>> entrySet ()

返回此映射中包含的映射的Set视图。 该集合由地图支持,因此对地图的更改反映在集合中,反之亦然。 如果在对集合进行迭代的过程中修改映射(除了通过迭代器自己的remove操作或通过对迭代器返回的映射条目执行setValue操作),迭代的结果是未定义的。 该组支持元件移除,即从映射中相应的映射,经由Iterator.remove,Set.remove,removeAll,retainAll clear和操作。 它不支持addaddAll操作。

Returns
Set<Entry<K, V>> a set view of the mappings contained in this map

forEach

Added in API level 24
void forEach (BiConsumer<? super K, ? super V> action)

对此映射中的每个条目执行给定操作,直到处理完所有条目或操作抛出异常为止。 除非实现类另有规定,否则按照条目集迭代的顺序执行操作(如果指定了迭代顺序)。操作抛出的异常会中继给调用者。

Parameters
action BiConsumer: The action to be performed for each entry

get

Added in API level 1
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

也可以看看:

isEmpty

Added in API level 1
boolean isEmpty ()

如果此映射不包含键 - 值映射,则返回 true

Returns
boolean true if this map contains no key-value mappings

keySet

Added in API level 1
Set<K> keySet ()

返回此映射中包含的键的Set视图。 该集合由地图支持,因此对地图的更改反映在集合中,反之亦然。 如果在对集合进行迭代时修改了映射(除了通过迭代器自己的remove操作),迭代的结果是未定义的。 该组支持元件移除,即从映射中相应的映射,经由Iterator.remove,Set.remove,removeAll,retainAll,clear操作。 它不支持addaddAll操作。

Returns
Set<K> a set view of the keys contained in this map

put

Added in API level 1
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.)

putAll

Added in API level 1
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

remove

Added in API level 1
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.)

replace

Added in API level 24
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

replaceAll

Added in API level 24
void replaceAll (BiFunction<? super K, ? super V, ? extends V> function)

用对该条目调用给定函数的结果替换每个条目的值,直到处理完所有条目或者该函数抛出异常。 函数抛出的异常会传递给调用者。

Parameters
function BiFunction: the function to apply to each entry

size

Added in API level 1
int size ()

返回此映射中键 - 值映射的数量。

Returns
int the number of key-value mappings in this map

values

Added in API level 1
Collection<V> values ()

返回此映射中包含的值的Collection视图。 该集合由地图支持,因此地图的更改会反映在集合中,反之亦然。 如果在对集合进行迭代时修改了映射(除了通过迭代器自己的remove操作),迭代的结果是未定义的。 该collection支持元素移除,即从映射中相应的映射,经由Iterator.remove,Collection.remove,removeAll,retainAll clear和操作。 它不支持addaddAll操作。

Returns
Collection<V> a collection view of the values contained in this map

Hooray!