Top Description Inners Fields Constructors Methods
java.util

public Class WeakHashMap<K, V>

extends AbstractMap<K, V>
implements Map<K, V>
Class Inheritance
All Implemented Interfaces
java.util.Map
Known Direct Subclasses
javax.security.auth.SubjectDomainCombiner.WeakKeyValueMap, java.lang.ClassValue.ClassValueMap
Type Parameters
<K>
the type of keys maintained by this map
<V>
the type of mapped values
Imports
java.lang.ref.WeakReference, .ReferenceQueue, java.util.function.BiConsumer, .BiFunction, .Consumer

Hash table based implementation of the Map interface, with weak keys. An entry in a WeakHashMap will automatically be removed when its key is no longer in ordinary use. More precisely, the presence of a mapping for a given key will not prevent the key from being discarded by the garbage collector, that is, made finalizable, finalized, and then reclaimed. When a key has been discarded its entry is effectively removed from the map, so this class behaves somewhat differently from other Map implementations.

Both null values and the null key are supported. This class has performance characteristics similar to those of the HashMap class, and has the same efficiency parameters of initial capacity and load factor.

Like most collection classes, this class is not synchronized. A synchronized WeakHashMap may be constructed using the Collections.synchronizedMap method.

This class is intended primarily for use with key objects whose equals methods test for object identity using the == operator. Once such a key is discarded it can never be recreated, so it is impossible to do a lookup of that key in a WeakHashMap at some later time and be surprised that its entry has been removed. This class will work perfectly well with key objects whose equals methods are not based upon object identity, such as String instances. With such recreatable key objects, however, the automatic removal of WeakHashMap entries whose keys have been discarded may prove to be confusing.

The behavior of the WeakHashMap class depends in part upon the actions of the garbage collector, so several familiar (though not required) Map invariants do not hold for this class. Because the garbage collector may discard keys at any time, a WeakHashMap may behave as though an unknown thread is silently removing entries. In particular, even if you synchronize on a WeakHashMap instance and invoke none of its mutator methods, it is possible for the size method to return smaller values over time, for the isEmpty method to return false and then true, for the containsKey method to return true and later false for a given key, for the get method to return a value for a given key but later return null, for the put method to return null and the remove method to return false for a key that previously appeared to be in the map, and for successive examinations of the key set, the value collection, and the entry set to yield successively smaller numbers of elements.

Each key object in a WeakHashMap is stored indirectly as the referent of a weak reference. Therefore a key will automatically be removed only after the weak references to it, both inside and outside of the map, have been cleared by the garbage collector.

Implementation Note

The value objects in a WeakHashMap are held by ordinary strong references. Thus care should be taken to ensure that value objects do not strongly refer to their own keys, either directly or indirectly, since that will prevent the keys from being discarded. Note that a value object may refer indirectly to its key via the WeakHashMap itself; that is, a value object may strongly refer to some other key object whose associated value object, in turn, strongly refers to the key of the first value object. If the values in the map do not rely on the map holding strong references to them, one way to deal with this is to wrap values themselves within WeakReferences before inserting, as in: m.put(key, new WeakReference(value)), and then unwrapping upon each get.

The iterators returned by the iterator method of the collections 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, Mark Reinhold
Since
1.2
See Also
java.util.HashMap, java.lang.ref.WeakReference

Nested and Inner Type Summary

Modifier and TypeClass and Description
private static class
WeakHashMap.Entry<K, V>

The entries in this hash table extend WeakReference, using its main ref field as the key.

private class
private class
pack-priv static class
private abstract class
private class
private class
pack-priv static class
private class
private class
pack-priv static class
pack-priv static class
WeakHashMap.WeakHashMapSpliterator<K, V>

Similar form as other hash Spliterators, but skips dead elements.

Field Summary

Modifier and TypeField and Description
private static final int
DEFAULT_INITIAL_CAPACITY

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

private static final float
DEFAULT_LOAD_FACTOR

The load factor used when none specified in constructor.

private transient Set<Map.Entry<K, V>>
private final float
loadFactor

The load factor for the hash table.

private 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 int
modCount

The number of times this WeakHashMap has been structurally modified.

private static final Object
NULL_KEY

Value representing null keys inside tables.

private final ReferenceQueue<Object>
queue

Reference queue for cleared WeakEntries

private int
size

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

pack-priv WeakHashMap.Entry<K, V>[]
table

The table, resized as necessary.

private int
threshold

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

Inherited from java.util.AbstractMap:
keySetvalues

Constructor Summary

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

Constructs a new, empty WeakHashMap with the given initial capacity and the given load factor.

public
WeakHashMap(int
The initial capacity of the WeakHashMap
initialCapacity
)

Constructs a new, empty WeakHashMap with the given initial capacity and the default load factor (0.75).

public
WeakHashMap()

Constructs a new, empty WeakHashMap with the default initial capacity (16) and load factor (0.75).

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

Constructs a new WeakHashMap with the same mappings as the specified map.

Method Summary

Modifier and TypeMethod and Description
public void
clear()

Overrides java.util.AbstractMap.clear.

Implements java.util.Map.clear.

Removes all of the mappings from this map.

public boolean

Returns:

true if there is a mapping for key; false otherwise
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.

private boolean
containsNullValue()

Special-case code for containsValue with null argument

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

Implements abstract java.util.AbstractMap.entrySet.

Implements java.util.Map.entrySet.

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

private void
expungeStaleEntries()

Expunges stale entries from the table.

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 WeakHashMap.Entry<K, V>
getEntry(Object key)

Returns the entry associated with the specified key in this map.

private WeakHashMap.Entry<K, V>[]
getTable()

Returns the table after first expunging stale entries.

pack-priv final int
hash(Object k)

Retrieve object hash code and applies a supplemental hash function to the result hash, which defends against poor quality hash functions.

private static int
indexFor(int h, int length)

Returns index for hash code h.

public boolean
isEmpty()

Overrides java.util.AbstractMap.isEmpty.

Implements java.util.Map.isEmpty.

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

public Set<K>
keySet()

Overrides java.util.AbstractMap.keySet.

Implements java.util.Map.keySet.

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

private static Object
maskNull(Object key)

Use NULL_KEY for key if it is null.

private boolean
matchesKey(WeakHashMap.Entry<K, V> e, Object key)

Checks for equality of non-null reference x and possibly-null y.

private WeakHashMap.Entry<K, V>[]
newTable(int n)

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

Returns:

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

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

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

Returns:

the previous value associated with key, or null if there was no mapping for 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 a key from this weak hash map if it is present.

pack-priv boolean
removeMapping(Object o)

Special version of remove needed by Entry set

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 void
resize(int
the new capacity, MUST be a power of two; must be greater than current capacity unless current capacity is MAXIMUM_CAPACITY (in which case value is irrelevant).
newCapacity
)

Rehashes the contents of this map into a new array with a larger capacity.

public int
size()

Overrides java.util.AbstractMap.size.

Implements java.util.Map.size.

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

private void
transfer(WeakHashMap.Entry<K, V>[] src, WeakHashMap.Entry<K, V>[] dest)

Transfers all entries from src to dest tables

pack-priv static Object
unmaskNull(Object key)

Returns internal representation of null key back to caller as null.

public Collection<V>
values()

Overrides java.util.AbstractMap.values.

Implements java.util.Map.values.

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

Inherited from java.util.AbstractMap:
cloneequalshashCodetoString