Class WeakIdentityHashMap

  • All Implemented Interfaces:
    java.util.Map

    public class WeakIdentityHashMap
    extends java.lang.Object
    implements java.util.Map
    A hashtable-based Map implementation with weak keys and using reference-equality in place of object-equality when comparing keys (and values). In an WeakIdentityHashMap, two keys k1 and k2 are considered equal if and only if (k1==k2). An entry in a WeakIdentityHashMap 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.

    Based on java.util.WeakHashMap

    Version:
    $Revision$
    See Also:
    IdentityHashMap, WeakHashMap
    • Field Summary

      Fields 
      Modifier and Type Field Description
      private static int DEFAULT_INITIAL_CAPACITY
      The default initial capacity -- MUST be a power of two.
      private static float DEFAULT_LOAD_FACTOR
      The load fast used when none specified in constructor.
      private java.util.Set entrySet  
      (package private) java.util.Set keySet
      Each of these fields are initialized to contain an instance of the appropriate view the first time this view is requested.
      private float loadFactor
      The load factor for the hash table.
      private static int MAXIMUM_CAPACITY
      The maximum capacity, used if a higher value is implicitly specified by either of the constructors with arguments.
      private 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 java.lang.Object NULL_KEY
      Value representing null keys inside tables.
      private java.lang.ref.ReferenceQueue queue
      Reference queue for cleared WeakEntries
      private int size
      The number of key-value mappings contained in this weak hash map.
      private WeakIdentityHashMap.Entry[] table
      The table, resized as necessary.
      private int threshold
      The next size value at which to resize (capacity * load factor).
      (package private) java.util.Collection values  
    • Constructor Summary

      Constructors 
      Constructor Description
      WeakIdentityHashMap()
      Constructs a new, empty WeakIdentityHashMap with the default initial capacity (16) and the default load factor (0.75).
      WeakIdentityHashMap​(int initialCapacity)
      Constructs a new, empty WeakIdentityHashMap with the given initial capacity and the default load factor, which is 0.75.
      WeakIdentityHashMap​(int initialCapacity, float loadFactor)
      Constructs a new, empty WeakIdentityHashMap with the given initial capacity and the given load factor.
      WeakIdentityHashMap​(java.util.Map t)
      Constructs a new WeakIdentityHashMap with the same mappings as the specified Map.
    • Method Summary

      All Methods Static Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      void clear()
      Removes all mappings from this map.
      boolean containsKey​(java.lang.Object key)
      Returns true if this map contains a mapping for the specified key.
      private boolean containsNullValue()
      Special-case code for containsValue with null argument
      boolean containsValue​(java.lang.Object value)
      Returns true if this map maps one or more keys to the specified value.
      java.util.Set entrySet()
      Returns a collection view of the mappings contained in this map.
      private void expungeStaleEntries()
      Expunge stale entries from the table.
      java.lang.Object get​(java.lang.Object key)
      Returns the value to which the specified key is mapped in this weak hash map, or null if the map contains no mapping for this key.
      (package private) WeakIdentityHashMap.Entry getEntry​(java.lang.Object key)
      Returns the entry associated with the specified key in the HashMap.
      private WeakIdentityHashMap.Entry[] getTable()
      Return the table after first expunging stale entries
      (package private) int hash​(java.lang.Object x)
      Return a hash code for non-null Object x.
      (package private) static int indexFor​(int h, int length)
      Return index for hash code h.
      boolean isEmpty()
      Returns true if this map contains no key-value mappings.
      java.util.Set keySet()
      Returns a set view of the keys contained in this map.
      private static java.lang.Object maskNull​(java.lang.Object key)
      Use NULL_KEY for key if it is null.
      java.lang.Object put​(java.lang.Object key, java.lang.Object value)
      Associates the specified value with the specified key in this map.
      void putAll​(java.util.Map t)
      Copies all of the mappings from the specified map to this map These mappings will replace any mappings that this map had for any of the keys currently in the specified map.
      java.lang.Object remove​(java.lang.Object key)
      Removes the mapping for this key from this map if present.
      (package private) WeakIdentityHashMap.Entry removeMapping​(java.lang.Object o)
      Special version of remove needed by Entry set
      (package private) void resize​(int newCapacity)
      Rehashes the contents of this map into a new HashMap instance with a larger capacity.
      int size()
      Returns the number of key-value mappings in this map.
      private void transfer​(WeakIdentityHashMap.Entry[] src, WeakIdentityHashMap.Entry[] dest)
      Transfer all entries from src to dest tables
      private static java.lang.Object unmaskNull​(java.lang.Object key)
      Return internal representation of null key back to caller as null
      java.util.Collection values()
      Returns a collection view of the values contained in this map.
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • Methods inherited from interface java.util.Map

        compute, computeIfAbsent, computeIfPresent, equals, forEach, getOrDefault, hashCode, merge, putIfAbsent, remove, replace, replace, replaceAll
    • Field Detail

      • DEFAULT_INITIAL_CAPACITY

        private static final int DEFAULT_INITIAL_CAPACITY
        The default initial capacity -- MUST be a power of two.
        See Also:
        Constant Field Values
      • MAXIMUM_CAPACITY

        private static final int MAXIMUM_CAPACITY
        The maximum capacity, used if a higher value is implicitly specified by either of the constructors with arguments. MUST be a power of two <= 1<<30.
        See Also:
        Constant Field Values
      • DEFAULT_LOAD_FACTOR

        private static final float DEFAULT_LOAD_FACTOR
        The load fast used when none specified in constructor.
        See Also:
        Constant Field Values
      • size

        private int size
        The number of key-value mappings contained in this weak hash map.
      • threshold

        private int threshold
        The next size value at which to resize (capacity * load factor).
      • loadFactor

        private final float loadFactor
        The load factor for the hash table.
      • queue

        private final java.lang.ref.ReferenceQueue queue
        Reference queue for cleared WeakEntries
      • modCount

        private volatile 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). This field is used to make iterators on Collection-views of the HashMap fail-fast. (See ConcurrentModificationException).
      • keySet

        transient volatile java.util.Set keySet
        Each of these fields are initialized to contain an instance of the appropriate view the first time this view is requested. The views are stateless, so there's no reason to create more than one of each.
      • values

        transient volatile java.util.Collection values
      • NULL_KEY

        private static final java.lang.Object NULL_KEY
        Value representing null keys inside tables.
      • entrySet

        private transient java.util.Set entrySet
    • Constructor Detail

      • WeakIdentityHashMap

        public WeakIdentityHashMap​(int initialCapacity,
                                   float loadFactor)
        Constructs a new, empty WeakIdentityHashMap with the given initial capacity and the given load factor.
        Parameters:
        initialCapacity - The initial capacity of the WeakIdentityHashMap
        loadFactor - The load factor of the WeakIdentityHashMap
        Throws:
        java.lang.IllegalArgumentException - If the initial capacity is negative, or if the load factor is nonpositive.
      • WeakIdentityHashMap

        public WeakIdentityHashMap​(int initialCapacity)
        Constructs a new, empty WeakIdentityHashMap with the given initial capacity and the default load factor, which is 0.75.
        Parameters:
        initialCapacity - The initial capacity of the WeakIdentityHashMap
        Throws:
        java.lang.IllegalArgumentException - If the initial capacity is negative.
      • WeakIdentityHashMap

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

        public WeakIdentityHashMap​(java.util.Map t)
        Constructs a new WeakIdentityHashMap with the same mappings as the specified Map. The WeakIdentityHashMap is created with default load factor, which is 0.75 and an initial capacity sufficient to hold the mappings in the specified Map.
        Parameters:
        t - the map whose mappings are to be placed in this map.
        Throws:
        java.lang.NullPointerException - if the specified map is null.
    • Method Detail

      • maskNull

        private static java.lang.Object maskNull​(java.lang.Object key)
        Use NULL_KEY for key if it is null.
      • unmaskNull

        private static java.lang.Object unmaskNull​(java.lang.Object key)
        Return internal representation of null key back to caller as null
      • hash

        int hash​(java.lang.Object x)
        Return a hash code for non-null Object x.
      • indexFor

        static int indexFor​(int h,
                            int length)
        Return index for hash code h.
      • expungeStaleEntries

        private void expungeStaleEntries()
        Expunge stale entries from the table.
      • size

        public int size()
        Returns the number of key-value mappings in this map. This result is a snapshot, and may not reflect unprocessed entries that will be removed before next attempted access because they are no longer referenced.
        Specified by:
        size in interface java.util.Map
      • isEmpty

        public boolean isEmpty()
        Returns true if this map contains no key-value mappings. This result is a snapshot, and may not reflect unprocessed entries that will be removed before next attempted access because they are no longer referenced.
        Specified by:
        isEmpty in interface java.util.Map
      • get

        public java.lang.Object get​(java.lang.Object key)
        Returns the value to which the specified key is mapped in this weak hash map, or null if the map contains no mapping for this key. A return value of null does not necessarily indicate that the map contains no mapping for the key; it is also possible that the map explicitly maps the key to null. The containsKey method may be used to distinguish these two cases.
        Specified by:
        get in interface java.util.Map
        Parameters:
        key - the key whose associated value is to be returned.
        Returns:
        the value to which this map maps the specified key, or null if the map contains no mapping for this key.
        See Also:
        put(Object, Object)
      • containsKey

        public boolean containsKey​(java.lang.Object key)
        Returns true if this map contains a mapping for the specified key.
        Specified by:
        containsKey in interface java.util.Map
        Parameters:
        key - The key whose presence in this map is to be tested
        Returns:
        true if there is a mapping for key; false otherwise
      • getEntry

        WeakIdentityHashMap.Entry getEntry​(java.lang.Object key)
        Returns the entry associated with the specified key in the HashMap. Returns null if the HashMap contains no mapping for this key.
      • put

        public java.lang.Object put​(java.lang.Object key,
                                    java.lang.Object value)
        Associates the specified value with the specified key in this map. If the map previously contained a mapping for this key, the old value is replaced.
        Specified by:
        put in interface java.util.Map
        Parameters:
        key - key with which the specified value is to be associated.
        value - value to be associated with the specified key.
        Returns:
        previous value associated with specified key, or null if there was no mapping for key. A null return can also indicate that the HashMap previously associated null with the specified key.
      • resize

        void resize​(int newCapacity)
        Rehashes the contents of this map into a new HashMap instance with a larger capacity. This method is called automatically when the number of keys in this map exceeds its capacity and load factor. Note that this method is a no-op if it's called with newCapacity == 2*MAXIMUM_CAPACITY (which is Integer.MIN_VALUE).
        Parameters:
        newCapacity - the new capacity, MUST be a power of two.
      • putAll

        public void putAll​(java.util.Map t)
        Copies all of the mappings from the specified map to this map These mappings will replace any mappings that this map had for any of the keys currently in the specified map.

        Specified by:
        putAll in interface java.util.Map
        Parameters:
        t - mappings to be stored in this map.
        Throws:
        java.lang.NullPointerException - if the specified map is null.
      • remove

        public java.lang.Object remove​(java.lang.Object key)
        Removes the mapping for this key from this map if present.
        Specified by:
        remove in interface java.util.Map
        Parameters:
        key - key whose mapping is to be removed from the map.
        Returns:
        previous value associated with specified key, or null if there was no mapping for key. A null return can also indicate that the map previously associated null with the specified key.
      • removeMapping

        WeakIdentityHashMap.Entry removeMapping​(java.lang.Object o)
        Special version of remove needed by Entry set
      • clear

        public void clear()
        Removes all mappings from this map.
        Specified by:
        clear in interface java.util.Map
      • containsValue

        public boolean containsValue​(java.lang.Object value)
        Returns true if this map maps one or more keys to the specified value.
        Specified by:
        containsValue in interface java.util.Map
        Parameters:
        value - value whose presence in this map is to be tested.
        Returns:
        true if this map maps one or more keys to the specified value.
      • containsNullValue

        private boolean containsNullValue()
        Special-case code for containsValue with null argument
      • keySet

        public java.util.Set keySet()
        Returns a set view of the keys contained in this map. The set is backed by the map, so changes to the map are reflected in the set, and vice-versa. The set supports element removal, which removes the corresponding mapping from this map, via the Iterator.remove, Set.remove, removeAll, retainAll, and clear operations. It does not support the add or addAll operations.
        Specified by:
        keySet in interface java.util.Map
        Returns:
        a set view of the keys contained in this map.
      • values

        public java.util.Collection values()
        Returns a collection view of the values contained in this map. The collection is backed by the map, so changes to the map are reflected in the collection, and vice-versa. The collection supports element removal, which removes the corresponding mapping from this map, via the Iterator.remove, Collection.remove, removeAll, retainAll, and clear operations. It does not support the add or addAll operations.
        Specified by:
        values in interface java.util.Map
        Returns:
        a collection view of the values contained in this map.
      • entrySet

        public java.util.Set entrySet()
        Returns a collection view of the mappings contained in this map. Each element in the returned collection is a Map.Entry. The collection is backed by the map, so changes to the map are reflected in the collection, and vice-versa. The collection supports element removal, which removes the corresponding mapping from the map, via the Iterator.remove, Collection.remove, removeAll, retainAll, and clear operations. It does not support the add or addAll operations.
        Specified by:
        entrySet in interface java.util.Map
        Returns:
        a collection view of the mappings contained in this map.
        See Also:
        Map.Entry