Class StrongInternPool<E>

  • All Implemented Interfaces:
    java.io.Serializable, java.lang.Cloneable

    class StrongInternPool<E>
    extends java.lang.Object
    implements java.lang.Cloneable, java.io.Serializable
    A strong intern pool. The pool acts as a set where the first stored entry can be retrieved. This can be used to conserve memory by eliminating duplicate objects (those that are equal but have different identity). It however holds strong references to every item in the pool, so it must be cleared to allow for GC. Note: It is very important to use a smaller load factor than you normally would for HashSet, since the implementation is open-addressed with linear probing. With a 50% load-factor a get is expected to return in only 2 probes. However, a 90% load-factor is expected to return in around 50 probes.
    • Field Detail

      • NULL

        private static final java.lang.Object NULL
        Marks null keys.
      • serialVersionUID

        private static final long serialVersionUID
        Serialization ID
        See Also:
        Constant Field Values
      • DEFAULT_CAPACITY

        private static final int DEFAULT_CAPACITY
        Same default as HashMap, must be a power of 2
        See Also:
        Constant Field Values
      • MAXIMUM_CAPACITY

        private static final int MAXIMUM_CAPACITY
        MAX_INT - 1
        See Also:
        Constant Field Values
      • DEFAULT_LOAD_FACTOR

        private static final float DEFAULT_LOAD_FACTOR
        67%, just like IdentityHashMap
        See Also:
        Constant Field Values
      • table

        private transient java.lang.Object[] table
        The open-addressed table
      • size

        private transient int size
        The current number of key-value pairs
      • threshold

        private transient int threshold
        The next resize
      • loadFactor

        private final float loadFactor
        The user defined load factor which defines when to resize
      • modCount

        private transient int modCount
        Counter used to detect changes made outside of an iterator
    • Constructor Detail

      • StrongInternPool

        public StrongInternPool​(int initialCapacity,
                                float loadFactor)
      • StrongInternPool

        public StrongInternPool​(int initialCapacity)
      • StrongInternPool

        public StrongInternPool()
    • Method Detail

      • init

        private void init​(int initialCapacity,
                          float loadFactor)
      • eq

        private static boolean eq​(java.lang.Object o1,
                                  java.lang.Object o2)
      • hash

        private static int hash​(java.lang.Object o)
      • maskNull

        private static final <K> K maskNull​(K key)
      • unmaskNull

        private static final <K> K unmaskNull​(K key)
      • nextIndex

        private int nextIndex​(int index,
                              int length)
      • index

        private static final int index​(int hashCode,
                                       int length)
      • size

        public int size()
      • isEmpty

        public boolean isEmpty()
      • contains

        public boolean contains​(java.lang.Object entry)
      • offset

        private int offset​(java.lang.Object entry)
      • intern

        public E intern​(E entry)
        Internalizes the specified object by always returning the first ever stored. Equivalent objects (via .equals) but with different identity (aka duplicates) can be eliminated with this method.
        Parameters:
        entry - the object to internalize
        Returns:
        the one true unique (and equivalent) object
      • resize

        private void resize​(int from)
      • remove

        public boolean remove​(java.lang.Object o)
      • relocate

        private void relocate​(int start)
      • clear

        public void clear()
      • clone

        public StrongInternPool<E> clone()
        Overrides:
        clone in class java.lang.Object
      • toInternalArray

        public java.lang.Object[] toInternalArray()
        Advanced method that returns the internal table. The resulting array will contain nulls at random places that must be skipped. In addition, it will not operate correctly if a null was inserted into the set. Use at your own risk....
        Returns:
        an array containing elements in this set along with randomly placed nulls,
      • printDebugStats

        public void printDebugStats()
      • readObject

        private void readObject​(java.io.ObjectInputStream s)
                         throws java.io.IOException,
                                java.lang.ClassNotFoundException
        Throws:
        java.io.IOException
        java.lang.ClassNotFoundException
      • putForCreate

        private void putForCreate​(E entry)
      • writeObject

        private void writeObject​(java.io.ObjectOutputStream s)
                          throws java.io.IOException
        Throws:
        java.io.IOException
      • iterator

        public java.util.Iterator<E> iterator()
      • toString

        public java.lang.String toString()
        Overrides:
        toString in class java.lang.Object