public abstract class AbstractReferenceMap<K,V> extends AbstractHashedMap<K ,V>
This class implements all the features necessary for a subclass reference hash-based map. Key-value entries are stored in instances of the ReferenceEntry class which can be overridden and replaced. The iterators can similarly be replaced, without the need to replace the KeySet, EntrySet and Values view classes.
Overridable methods are provided to change the default hashing behaviour, and to change how entries are added to and removed from the map. Hopefully, all you need for unusual subclasses is here.
When you construct an AbstractReferenceMap, you can specify what kind of references are used to store the map's keys and values. If non-hard references are used, then the garbage collector can remove mappings if a key or value becomes unreachable, or if the JVM's memory is running low. For information on how the different reference types behave, see Reference.
Different types of references can be specified for keys and values. The keys can be configured to be weak but the values hard, in which case this class will behave like a WeakHashMap. However, you can also specify hard keys and weak values, or any other combination. The default constructor uses hard keys and soft values, providing a memory-sensitive cache.
This Map implementation does not allow null elements. Attempting to add a null key or value to the map will raise a NullPointerException.
All the available iterators can be reset back to the start by casting to ResettableIterator and calling reset().
This implementation is not synchronized. You can use Collections to provide synchronized access to a ReferenceMap.
Reference
| Modifier and Type | Class and Description |
|---|---|
protected static class |
AbstractReferenceMap
A MapEntry implementation for the map.
|
static class |
AbstractReferenceMap
Reference type enum.
|
AbstractHashedMap.EntrySet <K,V>, AbstractHashedMap.EntrySetIterator <K,V>, AbstractHashedMap.HashEntry <K,V>, AbstractHashedMap.HashIterator <K,V>, AbstractHashedMap.HashMapIterator <K,V>, AbstractHashedMap.KeySet <K>, AbstractHashedMap.KeySetIterator <K>, AbstractHashedMap.Values <V>, AbstractHashedMap.ValuesIterator <V> AbstractMap.SimpleEntry <K,V>, AbstractMap.SimpleImmutableEntry <K,V> DEFAULT_CAPACITY, DEFAULT_LOAD_FACTOR, DEFAULT_THRESHOLD, GETKEY_INVALID, GETVALUE_INVALID, MAXIMUM_CAPACITY, NO_NEXT_ENTRY, NO_PREVIOUS_ENTRY, NULL, REMOVE_INVALID, SETVALUE_INVALID| Modifier | Constructor and Description |
|---|---|
protected |
AbstractReferenceMap()
Constructor used during deserialization.
|
protected |
AbstractReferenceMap(AbstractReferenceMap
Constructs a new empty map with the specified reference types, load factor and initial capacity.
|
| Modifier and Type | Method and Description |
|---|---|
void |
clear()
Clears this map.
|
boolean |
containsKey(Object
Checks whether the map contains the specified key.
|
boolean |
containsValue(Object
Checks whether the map contains the specified value.
|
protected AbstractReferenceMap |
createEntry(AbstractHashedMap
Creates a ReferenceEntry instead of a HashEntry.
|
protected Iterator |
createEntrySetIterator()
Creates an entry set iterator.
|
protected Iterator |
createKeySetIterator()
Creates an key set iterator.
|
protected Iterator |
createValuesIterator()
Creates an values iterator.
|
protected void |
doReadObject(ObjectInputStream
Replaces the superclass method to read the state of this class.
|
protected void |
doWriteObject(ObjectOutputStream
Replaces the superclass method to store the state of this class.
|
Set |
entrySet()
Returns a set view of this map's entries.
|
V |
get(Object
Gets the value mapped to the key specified.
|
protected AbstractHashedMap |
getEntry(Object
Gets the entry mapped to the key specified.
|
protected int |
hashEntry(Object
Gets the hash code for a MapEntry.
|
protected void |
init()
Initialise this subclass during construction, cloning or deserialization.
|
boolean |
isEmpty()
Checks whether the map is currently empty.
|
protected boolean |
isEqualKey(Object
Compares two keys, in internal converted form, to see if they are equal.
|
protected boolean |
isKeyType(AbstractReferenceMap
Provided protected read-only access to the key type.
|
Set |
keySet()
Returns a set view of this map's keys.
|
MapIterator |
mapIterator()
Gets a MapIterator over the reference map.
|
protected void |
purge()
Purges stale mappings from this map.
|
protected void |
purge(Reference
Purges the specified reference.
|
protected void |
purgeBeforeRead()
Purges stale mappings from this map before read operations.
|
protected void |
purgeBeforeWrite()
Purges stale mappings from this map before write operations.
|
V |
put(K key, V value)
Puts a key-value mapping into this map.
|
V |
remove(Object
Removes the specified mapping from this map.
|
int |
size()
Gets the size of the map.
|
Collection |
values()
Returns a collection view of this map's values.
|
addEntry, addMapping, calculateNewCapacity, calculateThreshold, checkCapacity, clone, convertKey, destroyEntry, ensureCapacity, entryHashCode, entryKey, entryNext, entryValue, equals, hash, hashCode, hashIndex, isEqualValue, putAll, removeEntry, removeMapping, reuseEntry, toString, updateEntryfinalize, getClass, notify, notifyAll, wait, wait, waitcompute, computeIfAbsent, computeIfPresent, forEach, getOrDefault, merge, putIfAbsent, remove, replace, replace, replaceAllprotected AbstractReferenceMap()
protected AbstractReferenceMap(AbstractReferenceMap.ReferenceStrength keyType, AbstractReferenceMap .ReferenceStrength valueType, int capacity, float loadFactor, boolean purgeValues)
keyType - the type of reference to use for keys; must be
HARD,
SOFT,
WEAK
valueType - the type of reference to use for values; must be
AbstractReferenceMap.ReferenceStrength.HARD ,
SOFT,
WEAK
capacity - the initial capacity for the map
loadFactor - the load factor for the map
purgeValues - should the value be automatically purged when the key is garbage collected
protected void init()
public int size()
public boolean isEmpty()
public boolean containsKey(Objectkey)
containsKey in interface
Map<K,V>
containsKey in interface
Get<K,V>
containsKey in class
AbstractHashedMap<K,V>
key - the key to search for
Map.containsKey(Object)
public boolean containsValue(Objectvalue)
containsValue in interface
Map<K,V>
containsValue in interface
Get<K,V>
containsValue in class
AbstractHashedMap<K,V>
value - the value to search for
Map.containsValue(Object)
public V put(K key, V value)
put in interface
Map<K,V>
put in interface
Put<K,V>
put in class
AbstractHashedMap<K,V>
key - the key to add, must not be null
value - the value to add, must not be null
NullPointerException - if either the key or value is null
Map.put(Object, Object)
public void clear()
public MapIterator<K ,V> mapIterator()
mapIterator in interface
IterableGet<K,V>
mapIterator in class
AbstractHashedMap<K,V>
public Set<Map .Entry <K ,V>> entrySet()
next() is called again. The
setValue() method on the
toArray entries has no effect.
public Collection<V> values()
protected void purgeBeforeRead()
This implementation calls purge() to maintain a consistent state.
protected void purgeBeforeWrite()
This implementation calls purge() to maintain a consistent state.
protected void purge()
Note that this method is not synchronized! Special care must be taken if, for instance, you want stale mappings to be removed on a periodic basis by some background thread.
protected void purge(Reference<?> ref)
ref - the reference to purge
protected AbstractHashedMap.HashEntry <K ,V> getEntry(Object key)
getEntry in class
AbstractHashedMap<K,V>
key - the key
protected int hashEntry(Objectkey, Object value)
key - the key to get a hash code for, may be null
value - the value to get a hash code for, may be null
protected boolean isEqualKey(Objectkey1, Object key2)
This implementation converts the key from the entry to a real reference before comparison.
isEqualKey in class
AbstractHashedMap<K,V>
key1 - the first key to compare passed in from outside
key2 - the second key extracted from the entry via
entry.key
protected AbstractReferenceMap.ReferenceEntry <K ,V> createEntry(AbstractHashedMap .HashEntry <K ,V> next, int hashCode, K key, V value)
createEntry in class
AbstractHashedMap<K,V>
next - the next entry in sequence
hashCode - the hash code to use
key - the key to store
value - the value to store
protected Iterator<Map .Entry <K ,V>> createEntrySetIterator()
createEntrySetIterator in class
AbstractHashedMap<K,V>
protected Iterator<K> createKeySetIterator()
createKeySetIterator in class
AbstractHashedMap<K,V>
protected Iterator<V> createValuesIterator()
createValuesIterator in class
AbstractHashedMap<K,V>
protected void doWriteObject(ObjectOutputStreamout) throws IOException
Serialization is not one of the JDK's nicest topics. Normal serialization will initialise the superclass before the subclass. Sometimes however, this isn't what you want, as in this case the put() method on read can be affected by subclass state.
The solution adopted here is to serialize the state data of this class in this protected method. This method must be called by the writeObject() of the first serializable subclass.
Subclasses may override if they have a specific field that must be present on read before this implementation will work. Generally, the read determines what must be serialized here, if anything.
doWriteObject in class
AbstractHashedMap<K,V>
out - the output stream
IOException - if an error occurs while writing to the stream
protected void doReadObject(ObjectInputStreamin) throws IOException , ClassNotFoundException
Serialization is not one of the JDK's nicest topics. Normal serialization will initialise the superclass before the subclass. Sometimes however, this isn't what you want, as in this case the put() method on read can be affected by subclass state.
The solution adopted here is to deserialize the state data of this class in this protected method. This method must be called by the readObject() of the first serializable subclass.
Subclasses may override if the subclass has a specific field that must be present before put() or calculateThreshold() will work correctly.
doReadObject in class
AbstractHashedMap<K,V>
in - the input stream
IOException - if an error occurs while reading from the stream
ClassNotFoundException - if an object read from the stream can not be loaded
protected boolean isKeyType(AbstractReferenceMap.ReferenceStrength type)
type - the type to check against.