Class WeakIdentityHashMap<K,V>

java.lang.Object
com.pnfsoftware.jeb.util.collect.WeakIdentityHashMap<K,V>
Type Parameters:
K - key type
V - value type

@Ser public class WeakIdentityHashMap<K,V> extends Object
A pseudo map where keys are compared using identity comparison (like IdentityHashMap) but where the presence of an object as a key in the map does not prevent it being garbage collected (like WeakHashMap). This class does not implement the Map interface because it is difficult to ensure correct semantics for iterators over the entrySet(). This map does not support null keys.

Because we do not implement Map, we do not copy the questionable interface where you can call get(k) or remove(k) for any type of k, which of course can only have an effect if k is of type K.

Implementation note: The approach is to wrap each key in a WeakReference and use the wrapped value as a key in an ordinary HashMap. The WeakReference has to be a subclass IdentityWeakReference (IWR) where two IWRs are equal if they refer to the same object. This enables us to find the entry again.

Forked from https://android.googlesource.com/platform/libcore/+/42cdd0bf7251074df8bf6dfa7f5d62a01c0a1ef6/ojluni/src/main/java/com/sun/jmx/mbeanserver/WeakIdentityHashMap.java

  • Constructor Details

    • WeakIdentityHashMap

      public WeakIdentityHashMap(int initialCapacity, float loadFactor)
      Create a weak identity hash map.
      Parameters:
      initialCapacity - initial capacity
      loadFactor - load factor
    • WeakIdentityHashMap

      public WeakIdentityHashMap(int initialCapacity)
      Create a weak identity hash map.
      Parameters:
      initialCapacity - initial capacity
    • WeakIdentityHashMap

      public WeakIdentityHashMap()
      Create a weak identity hash map.
  • Method Details

    • get

      public V get(K key)
      Retrieve a value.
      Parameters:
      key - key compared by identity
      Returns:
      mapped value, or null
    • keySet

      public Set<K> keySet()
      Retrieve live keys.
      Returns:
      copy of the live key set
    • size

      public int size()
      Returns:
      number of live entries
    • isEmpty

      public boolean isEmpty()
      Returns:
      true if no live entry exists
    • values

      public Collection<V> values()
      Retrieve values.
      Returns:
      collection of values
    • entrySet

      public Set<Map.Entry<K,V>> entrySet()
      Retrieve live entries.
      Returns:
      copy of the live entry set
    • put

      public V put(K key, V value)
      Add or replace a mapping.
      Parameters:
      key - non-null key compared by identity
      value - value
      Returns:
      previous value, or null
    • putUnsafe

      public V putUnsafe(K key, V value)
      Add or replace a mapping without rejecting null keys.
      Parameters:
      key - key compared by identity
      value - value
      Returns:
      previous value, or null
    • remove

      public V remove(K key)
      Remove a mapping.
      Parameters:
      key - key compared by identity
      Returns:
      removed value, or null
    • clear

      public void clear()
      Remove all mappings.
    • toString

      public String toString()
      Overrides:
      toString in class Object
    • expunge

      public void expunge()
      Remove entries whose weak keys were collected.