com.google.common.collect
Class ReferenceMap<K,V>

java.lang.Object
  extended by java.util.AbstractMap<K,V>
      extended by com.google.common.collect.ReferenceMap<K,V>
All Implemented Interfaces:
Serializable, ConcurrentMap<K,V>, Map<K,V>

public final class ReferenceMap<K,V>
extends AbstractMap<K,V>
implements ConcurrentMap<K,V>, Serializable

A ConcurrentMap implementation that internally utilizes your choice of strong, soft or weak references for its keys and for its values. As soon as any key or value is reclaimed by the garbage collector, the corresponding entry automatically disappears from the map.

All nine possible combinations of reference types are supported, although using strong keys with strong values provides no benefit over using a Map or ConcurrentMap directly. This implementation does not permit null keys or values.

Note: because garbage collection happens concurrently to your program, it follows that this map is always subject to concurrent modifications, whether or not the caller exposes it to multiple application threads. The usual caveats about the reliability of methods such as size() and Map.equals(java.lang.Object) apply; for example, size() may be observed to remain unchanged for a short time after an entry was reclaimed.

To determine equality to a key, this implementation uses Object.equals(java.lang.Object) for strong references, and identity-based equality for soft and weak references. In other words, for a map with weak or soft key references, get(java.lang.Object) returns null when passed an object that equals a map key, but isn't the same instance. This behavior is similar to the way IdentityHashMap handles key lookups. However, to determine value equality, as occurs when containsValue(java.lang.Object) is called, the ReferenceMap always uses equals, regardless of the value reference type.

Note: new ReferenceMap(WEAK, STRONG) is very nearly a drop-in replacement for WeakHashMap, but improves upon this by using only identity-based equality for keys. When possible, ReferenceMap should be preferred over the JDK collection, for its concurrency and greater flexibility.

Though this class implements Serializable, serializing reference maps with weak or soft references leads to unpredictable results.

Author:
Bob Lee, Kevin Bourrillion
See Also:
Serialized Form

Nested Class Summary
 
Nested classes/interfaces inherited from interface java.util.Map
Map.Entry<K,V>
 
Constructor Summary
ReferenceMap(ReferenceType keyReferenceType, ReferenceType valueReferenceType)
          Constructs an empty instance, using the given reference types for keys and values.
ReferenceMap(ReferenceType keyReferenceType, ReferenceType valueReferenceType, ConcurrentMap<Object,Object> backingMap)
          Constructs an empty instance, using the given backing map and the given reference types for keys and values.
 
Method Summary
 void clear()
          Removes all of the mappings from this map.
 boolean containsKey(Object key)
          Returns true if this map contains a mapping for the specified key.
 boolean containsValue(Object value)
          Returns true if this map maps one or more keys to the specified value.
 Set<Map.Entry<K,V>> entrySet()
          
 V get(Object key)
          Returns the value to which the specified key is mapped, or null if this map contains no mapping for the key.
 boolean isEmpty()
          Returns true if this map contains no key-value mappings.
 V put(K key, V value)
          Associates the specified value with the specified key in this map.
 V putIfAbsent(K key, V value)
           
 V remove(Object key)
          Removes the mapping for a key from this map if it is present.
 boolean remove(Object key, Object value)
           
 V replace(K key, V value)
           
 boolean replace(K key, V oldValue, V newValue)
           
 int size()
          Returns the number of key-value mappings in this map.
 
Methods inherited from class java.util.AbstractMap
clone, equals, hashCode, keySet, putAll, toString, values
 
Methods inherited from class java.lang.Object
finalize, getClass, notify, notifyAll, wait, wait, wait
 
Methods inherited from interface java.util.Map
equals, hashCode, keySet, putAll, values
 

Constructor Detail

ReferenceMap

public ReferenceMap(ReferenceType keyReferenceType,
                    ReferenceType valueReferenceType)
Constructs an empty instance, using the given reference types for keys and values.


ReferenceMap

public ReferenceMap(ReferenceType keyReferenceType,
                    ReferenceType valueReferenceType,
                    ConcurrentMap<Object,Object> backingMap)
Constructs an empty instance, using the given backing map and the given reference types for keys and values.

Method Detail

size

public int size()
Returns the number of key-value mappings in this map.

Specified by:
size in interface Map<K,V>
Overrides:
size in class AbstractMap<K,V>

isEmpty

public boolean isEmpty()
Returns true if this map contains no key-value mappings.

Specified by:
isEmpty in interface Map<K,V>
Overrides:
isEmpty in class AbstractMap<K,V>

containsKey

public boolean containsKey(Object key)
Returns true if this map contains a mapping for the specified key.

Specified by:
containsKey in interface Map<K,V>
Overrides:
containsKey in class AbstractMap<K,V>

containsValue

public boolean containsValue(Object value)
Returns true if this map maps one or more keys to the specified value.

Specified by:
containsValue in interface Map<K,V>
Overrides:
containsValue in class AbstractMap<K,V>

get

public V get(Object key)
Returns the value to which the specified key is mapped, or null if this map contains no mapping for the key.

Specified by:
get in interface Map<K,V>
Overrides:
get in class AbstractMap<K,V>

put

public V put(K key,
             V value)
Associates the specified value with the specified key in this map.

Specified by:
put in interface Map<K,V>
Overrides:
put in class AbstractMap<K,V>

putIfAbsent

public V putIfAbsent(K key,
                     V value)
Specified by:
putIfAbsent in interface ConcurrentMap<K,V>

replace

public V replace(K key,
                 V value)
Specified by:
replace in interface ConcurrentMap<K,V>

replace

public boolean replace(K key,
                       V oldValue,
                       V newValue)
Specified by:
replace in interface ConcurrentMap<K,V>

remove

public V remove(Object key)
Removes the mapping for a key from this map if it is present.

Specified by:
remove in interface Map<K,V>
Overrides:
remove in class AbstractMap<K,V>

remove

public boolean remove(Object key,
                      Object value)
Specified by:
remove in interface ConcurrentMap<K,V>

clear

public void clear()
Removes all of the mappings from this map.

Specified by:
clear in interface Map<K,V>
Overrides:
clear in class AbstractMap<K,V>

entrySet

public Set<Map.Entry<K,V>> entrySet()

Note: Regardless of the choice of key and value reference types, an entry in the entry set always has strong references to both key and value. You should avoid any lingering strong references to Entry objects.

Specified by:
entrySet in interface Map<K,V>
Specified by:
entrySet in class AbstractMap<K,V>