Top Description Inners Fields Constructors Methods
java.util

public Class HashMap<K, V>

extends AbstractMap<K, V>
implements Map<K, V>, Cloneable, Serializable
Class Inheritance
All Implemented Interfaces
java.io.Serializable, java.lang.Cloneable, java.util.Map
Known Direct Subclasses
java.util.LinkedHashMap, sun.net.www.http.KeepAliveCache
Type Parameters
<K>
the type of keys maintained by this map
<V>
the type of mapped values
Imports
java.io.IOException, .InvalidObjectException, .ObjectInputStream, .Serializable, java.lang.reflect.ParameterizedType, .Type, java.util.function.BiConsumer, .BiFunction, .Consumer, .Function, jdk.internal.access.SharedSecrets

Hash table based implementation of the Map interface. This implementation provides all of the optional map operations, and permits null values and the null key. (The HashMap class is roughly equivalent to Hashtable, except that it is unsynchronized and permits nulls.) This class makes no guarantees as to the order of the map; in particular, it does not guarantee that the order will remain constant over time.

This implementation provides constant-time performance for the basic operations (get and put), assuming the hash function disperses the elements properly among the buckets. Iteration over collection views requires time proportional to the "capacity" of the HashMap instance (the number of buckets) plus its size (the number of key-value mappings). Thus, it's very important not to set the initial capacity too high (or the load factor too low) if iteration performance is important.

An instance of HashMap has two parameters that affect its performance: initial capacity and load factor. The capacity is the number of buckets in the hash table, and the initial capacity is simply the capacity at the time the hash table is created. The load factor is a measure of how full the hash table is allowed to get before its capacity is automatically increased. When the number of entries in the hash table exceeds the product of the load factor and the current capacity, the hash table is rehashed (that is, internal data structures are rebuilt) so that the hash table has approximately twice the number of buckets.

As a general rule, the default load factor (.75) offers a good tradeoff between time and space costs. Higher values decrease the space overhead but increase the lookup cost (reflected in most of the operations of the HashMap class, including get and put). The expected number of entries in the map and its load factor should be taken into account when setting its initial capacity, so as to minimize the number of rehash operations. If the initial capacity is greater than the maximum number of entries divided by the load factor, no rehash operations will ever occur.

If many mappings are to be stored in a HashMap instance, creating it with a sufficiently large capacity will allow the mappings to be stored more efficiently than letting it perform automatic rehashing as needed to grow the table. Note that using many keys with the same hashCode() is a sure way to slow down performance of any hash table. To ameliorate impact, when keys are Comparable, this class may use comparison order among keys to help break ties.

Note that this implementation is not synchronized. If multiple threads access a hash map concurrently, and at least one of the threads modifies the map structurally, it must be synchronized externally. (A structural modification is any operation that adds or deletes one or more mappings; merely changing the value associated with a key that an instance already contains is not a structural modification.) This is typically accomplished by synchronizing on some object that naturally encapsulates the map. If no such object exists, the map should be "wrapped" using the Collections.synchronizedMap method. This is best done at creation time, to prevent accidental unsynchronized access to the map:

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

The iterators returned by all of this class's "collection view methods" are fail-fast: if the map is structurally modified at any time after the iterator is created, in any way except through the iterator's own remove method, the iterator will throw a ConcurrentModificationException. Thus, in the face of concurrent modification, the iterator fails quickly and cleanly, rather than risking arbitrary, non-deterministic behavior at an undetermined time in the future.

Note that the fail-fast behavior of an iterator cannot be guaranteed as it is, generally speaking, impossible to make any hard guarantees in the presence of unsynchronized concurrent modification. Fail-fast iterators throw ConcurrentModificationException on a best-effort basis. Therefore, it would be wrong to write a program that depended on this exception for its correctness: the fail-fast behavior of iterators should be used only to detect bugs.

This class is a member of the Java Collections Framework.

Authors
Doug Lea, Josh Bloch, Arthur van Hoff, Neal Gafter
Since
1.2
See Also
Object#hashCode(), Collection, Map, TreeMap, Hashtable

Nested and Inner Type Summary

Modifier and TypeClass and Description
pack-priv class
pack-priv class
pack-priv static class
pack-priv abstract class
pack-priv static class
pack-priv class
pack-priv class
pack-priv static class
pack-priv static class
HashMap.Node<K, V>

Basic hash bin node, used for most entries.

pack-priv static class
HashMap.TreeNode<K, V>

Entry for Tree bins.

private static class
pack-priv class
pack-priv class
pack-priv static class

Field Summary

Modifier and TypeField and Description
pack-priv static final int
DEFAULT_INITIAL_CAPACITY

The default initial capacity - MUST be a power of two.

pack-priv static final float
DEFAULT_LOAD_FACTOR

The load factor used when none specified in constructor.

pack-priv transient Set<Map.Entry<K, V>>
entrySet

Holds cached entrySet().

pack-priv final float
loadFactor

The load factor for the hash table.

pack-priv static final int
MAXIMUM_CAPACITY

The maximum capacity, used if a higher value is implicitly specified by either of the constructors with arguments.

pack-priv static final int
MIN_TREEIFY_CAPACITY

The smallest table capacity for which bins may be treeified.

pack-priv transient int
modCount

The number of times this HashMap has been structurally modified Structural modifications are those that change the number of mappings in the HashMap or otherwise modify its internal structure (e.g., rehash).

private static final long
pack-priv transient int
size

The number of key-value mappings contained in this map.

pack-priv transient HashMap.Node<K, V>[]
table

The table, initialized on first use, and resized as necessary.

pack-priv int
threshold

The next size value at which to resize (capacity * load factor).

pack-priv static final int
TREEIFY_THRESHOLD

The bin count threshold for using a tree rather than list for a bin.

pack-priv static final int
UNTREEIFY_THRESHOLD

The bin count threshold for untreeifying a (split) bin during a resize operation.

Inherited from java.util.AbstractMap:
keySetvalues

Constructor Summary

AccessConstructor and Description
public
HashMap(int
the initial capacity
initialCapacity
,
float
the load factor
loadFactor
)

Constructs an empty HashMap with the specified initial capacity and load factor.

public
HashMap(int
the initial capacity.
initialCapacity
)

Constructs an empty HashMap with the specified initial capacity and the default load factor (0.75).

public
HashMap()

Constructs an empty HashMap with the default initial capacity (16) and the default load factor (0.75).

public
HashMap(Map<? extends K, ? extends V>
the map whose mappings are to be placed in this map
m
)

Constructs a new HashMap with the same mappings as the specified Map.

Method Summary

Modifier and TypeMethod and Description
pack-priv void
pack-priv void
afterNodeInsertion(boolean evict)

pack-priv void
pack-priv static int

Returns:

initial capacity for HashMap based classes.
calculateHashMapCapacity
(int
the expected number of mappings
numMappings
)

Calculate initial capacity for HashMap based classes, from expected size and default load factor (0.75).

pack-priv final int
public void
clear()

Overrides java.util.AbstractMap.clear.

Implements java.util.Map.clear.

Removes all of the mappings from this map.

public Object

Returns:

a shallow copy of this map
clone
()

Overrides java.util.AbstractMap.clone.

Returns a shallow copy of this HashMap instance: the keys and values themselves are not cloned.

pack-priv static Class<?>
comparableClassFor(Object x)

Returns x's Class if it is of the form "class C implements Comparable<C>", else null.

pack-priv static int
compareComparables(Class<?> kc, Object k, Object x)

Returns k.compareTo(x) if x matches kc (k's screened comparable class), else 0.

public V
compute(K
key with which the specified value is to be associated
key
,
BiFunction<? super K, ? super V, ? extends V>
the remapping function to compute a value
remappingFunction
)

Overrides default java.util.Map.compute.

Attempts to compute a mapping for the specified key and its current mapped value, or null if there is no current mapping (optional operation).

public V
computeIfAbsent(K
key with which the specified value is to be associated
key
,
Function<? super K, ? extends V>
the mapping function to compute a value
mappingFunction
)

Overrides default java.util.Map.computeIfAbsent.

If the specified key is not already associated with a value (or is mapped to null), attempts to compute its value using the given mapping function and enters it into this map unless null (optional operation).

public V
computeIfPresent(K
key with which the specified value is to be associated
key
,
BiFunction<? super K, ? super V, ? extends V>
the remapping function to compute a value
remappingFunction
)

Overrides default java.util.Map.computeIfPresent.

If the value for the specified key is present and non-null, attempts to compute a new mapping given the key and its current mapped value (optional operation).

public boolean

Returns:

true if this map contains a mapping for the specified key.
containsKey
(Object
The key whose presence in this map is to be tested
key
)

Overrides java.util.AbstractMap.containsKey.

Implements java.util.Map.containsKey.

Returns true if this map contains a mapping for the specified key.

public boolean

Returns:

true if this map maps one or more keys to the specified value
containsValue
(Object
value whose presence in this map is to be tested
value
)

Overrides java.util.AbstractMap.containsValue.

Implements java.util.Map.containsValue.

Returns true if this map maps one or more keys to the specified value.

public Set<Map.Entry<K, V>>

Returns:

a set view of the mappings contained in this map
entrySet
()

Implements abstract java.util.AbstractMap.entrySet.

Implements java.util.Map.entrySet.

Returns a Set view of the mappings contained in this map.

public void
forEach(BiConsumer<? super K, ? super V>
The action to be performed for each entry
action
)

Overrides default java.util.Map.forEach.

Performs the given action for each entry in this map until all entries have been processed or the action throws an exception.

public V
get(Object
the key whose associated value is to be returned
key
)

Overrides java.util.AbstractMap.get.

Implements java.util.Map.get.

Returns the value to which the specified key is mapped, or null if this map contains no mapping for the key.

pack-priv final HashMap.Node<K, V>

Returns:

the node, or null if none
getNode
(Object
the key
key
)

Implements Map.get and related methods.

public V
getOrDefault(Object
the key whose associated value is to be returned
key
,
V
the default mapping of the key
defaultValue
)

Overrides default java.util.Map.getOrDefault.

Returns the value to which the specified key is mapped, or defaultValue if this map contains no mapping for the key.

pack-priv static final int
hash(Object key)

Computes key.hashCode() and spreads (XORs) higher bits of hash to lower.

pack-priv void
public boolean

Returns:

true if this map contains no key-value mappings
isEmpty
()

Overrides java.util.AbstractMap.isEmpty.

Implements java.util.Map.isEmpty.

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

public Set<K>

Returns:

a set view of the keys contained in this map
keySet
()

Overrides java.util.AbstractMap.keySet.

Implements java.util.Map.keySet.

Returns a Set view of the keys contained in this map.

pack-priv <
type of array elements
T
>
T[]

Returns:

supplied array
keysToArray
(T[]
an array to fill
a
)

Fills an array with this map keys and returns it.

pack-priv final float
public V
merge(K
key with which the resulting value is to be associated
key
,
V
the non-null value to be merged with the existing value associated with the key or, if no existing value or a null value is associated with the key, to be associated with the key
value
,
BiFunction<? super V, ? super V, ? extends V>
the remapping function to recompute a value if present
remappingFunction
)

Overrides default java.util.Map.merge.

If the specified key is not already associated with a value or is associated with null, associates it with the given non-null value (optional operation).

public static <
the type of keys maintained by the new map
K
,
the type of mapped values
V
>
HashMap<K, V>

Returns:

the newly created map
newHashMap
(int
the expected number of mappings
numMappings
)

Creates a new, empty HashMap suitable for the expected number of mappings.

pack-priv HashMap.Node<K, V>
newNode(int hash, K key, V value, HashMap.Node<K, V> next)

pack-priv HashMap.TreeNode<K, V>
newTreeNode(int hash, K key, V value, HashMap.Node<K, V> next)

pack-priv final <
type of array elements
T
>
T[]

Returns:

an array ready to be filled and returned from toArray() method.
prepareArray
(T[]
an original array passed to toArray() method
a
)

Prepares the array for Collection#toArray(Object[]) implementation.

public V

Returns:

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.)
put
(K
key with which the specified value is to be associated
key
,
V
value to be associated with the specified key
value
)

Overrides java.util.AbstractMap.put.

Implements java.util.Map.put.

Associates the specified value with the specified key in this map.

public void
putAll(Map<? extends K, ? extends V>
mappings to be stored in this map
m
)

Overrides java.util.AbstractMap.putAll.

Implements java.util.Map.putAll.

Copies all of the mappings from the specified map to this map.

public V
putIfAbsent(K
key with which the specified value is to be associated
key
,
V
value to be associated with the specified key
value
)

Overrides default java.util.Map.putIfAbsent.

If the specified key is not already associated with a value (or is mapped to null) associates it with the given value and returns null, else returns the current value (optional operation).

pack-priv final void
putMapEntries(Map<? extends K, ? extends V>
the map
m
,
boolean
false when initially constructing this map, else true (relayed to method afterNodeInsertion).
evict
)

Implements Map.putAll and Map constructor.

pack-priv final V

Returns:

previous value, or null if none
putVal
(int
hash for key
hash
,
K
the key
key
,
V
the value to put
value
,
boolean
if true, don't change existing value
onlyIfAbsent
,
boolean
if false, the table is in creation mode.
evict
)

Implements Map.put and related methods.

private void
readObject(ObjectInputStream
the stream
s
)

Reconstitutes this map from a stream (that is, deserializes it).

pack-priv void
reinitialize()

Reset to initial default state.

public V

Returns:

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.)
remove
(Object
key whose mapping is to be removed from the map
key
)

Overrides java.util.AbstractMap.remove.

Implements java.util.Map.remove.

Removes the mapping for the specified key from this map if present.

public boolean
remove(Object
key with which the specified value is associated
key
,
Object
value expected to be associated with the specified key
value
)

Overrides default java.util.Map.remove.

Removes the entry for the specified key only if it is currently mapped to the specified value (optional operation).

pack-priv final HashMap.Node<K, V>

Returns:

the node, or null if none
removeNode
(int
hash for key
hash
,
Object
the key
key
,
Object
the value to match if matchValue, else ignored
value
,
boolean
if true only remove if value is equal
matchValue
,
boolean
if false do not move other nodes while removing
movable
)

Implements Map.remove and related methods.

public boolean
replace(K
key with which the specified value is associated
key
,
V
value expected to be associated with the specified key
oldValue
,
V
value to be associated with the specified key
newValue
)

Overrides default java.util.Map.replace.

Replaces the entry for the specified key only if currently mapped to the specified value (optional operation).

public V
replace(K
key with which the specified value is associated
key
,
V
value to be associated with the specified key
value
)

Overrides default java.util.Map.replace.

Replaces the entry for the specified key only if it is currently mapped to some value (optional operation).

public void
replaceAll(BiFunction<? super K, ? super V, ? extends V>
the function to apply to each entry
function
)

Overrides default java.util.Map.replaceAll.

Replaces each entry's value with the result of invoking the given function on that entry until all entries have been processed or the function throws an exception (optional operation).

pack-priv HashMap.Node<K, V>
replacementNode(HashMap.Node<K, V> p, HashMap.Node<K, V> next)

pack-priv HashMap.TreeNode<K, V>
pack-priv final HashMap.Node<K, V>[]

Returns:

the table
resize
()

Initializes or doubles table size.

public int

Returns:

the number of key-value mappings in this map
size
()

Overrides java.util.AbstractMap.size.

Implements java.util.Map.size.

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

pack-priv static final int
tableSizeFor(int cap)

Returns a power of two size for the given target capacity.

pack-priv final void
treeifyBin(HashMap.Node<K, V>[] tab, int hash)

Replaces all linked nodes in bin at index for given hash unless table is too small, in which case resizes instead.

public Collection<V>

Returns:

a view of the values contained in this map
values
()

Overrides java.util.AbstractMap.values.

Implements java.util.Map.values.

Returns a Collection view of the values contained in this map.

pack-priv <
type of array elements
T
>
T[]

Returns:

supplied array
valuesToArray
(T[]
an array to fill
a
)

Fills an array with this map values and returns it.

private void
writeObject(ObjectOutputStream
the stream
s
)

Saves this map to a stream (that is, serializes it).

Inherited from java.util.AbstractMap:
equalshashCodetoString