public class SafeHashMap<K,V> extends AbstractMap<K,V> implements Cloneable, Serializable
All additions and removals are synchronized on the map, so to temporarily prevent changes to the map contents, synchronize on the map object.
Modifier and Type | Class and Description |
---|---|
protected static class |
SafeHashMap.Entry<K,V>
A map entry (key-value pair).
|
protected class |
SafeHashMap.EntrySet
A set of entries backed by this map.
|
protected class |
SafeHashMap.KeySet
A set of entries backed by this map.
|
protected class |
SafeHashMap.ValuesCollection
A collection of values backed by this map.
|
AbstractMap.SimpleEntry<K,V>, AbstractMap.SimpleImmutableEntry<K,V>
Modifier and Type | Field and Description |
---|---|
protected static int |
BIGGEST_MODULO
Biggest possible modulo.
|
static float |
DEFAULT_GROWTHRATE
Using the default growth rate, the bucket array will grow by a factor
of four.
|
static int |
DEFAULT_INITIALSIZE
Default initial size provides a prime modulo and is large enough that
resize is not immediate.
|
static float |
DEFAULT_LOADFACTOR
The default load factor is 100%, which means that the hash map will not
resize until there is (on average) one entry in every bucket.
|
protected AtomicReferenceArray<SafeHashMap.Entry> |
m_aeBucket
The array of hash buckets.
|
protected int |
m_cCapacity
The capacity of the hash map (the point at which it must resize), 1 <= n.
|
protected int |
m_cEntries
The number of entries stored in the hash map, 0 <= n.
|
protected SafeHashMap.ValuesCollection |
m_colValues
The collection of values backed by this map.
|
protected float |
m_flGrowthRate
The rate of growth as a fraction of the current number of buckets,
0 < n, such that the hash map grows to bucketCount * (1 + growthRate)
|
protected float |
m_flLoadFactor
The determining factor for the hash map capacity given a certain number
of buckets, such that capacity = bucketCount * loadFactor.
|
protected Object |
m_oIterActive
A holder for active Iterator(s): either WeakReference(<Iterator>) or
WeakHashMap(<Iterator>, null)
|
protected SafeHashMap.EntrySet |
m_setEntries
The set of entries backed by this map.
|
protected SafeHashMap.KeySet |
m_setKeys
The set of keys backed by this map.
|
protected Object |
RESIZING
When resizing completes, a notification is issued against this object.
|
Constructor and Description |
---|
SafeHashMap()
Construct a thread-safe hash map using the default settings.
|
SafeHashMap(int cInitialBuckets,
float flLoadFactor,
float flGrowthRate)
Construct a thread-safe hash map using the specified settings.
|
Modifier and Type | Method and Description |
---|---|
void |
clear()
Removes all mappings from this map.
|
Object |
clone()
Create a clone of the SafeHashMap.
|
protected SafeHashMap.Entry |
cloneEntryList(SafeHashMap.Entry entryThat)
Clone an entire linked list of entries.
|
boolean |
containsKey(Object key)
Returns true if this map contains a mapping for the specified
key.
|
Set<Map.Entry<K,V>> |
entrySet()
Returns a set view of the mappings contained in this map.
|
V |
get(Object key)
Returns the value to which this map maps the specified key.
|
protected int |
getBucketIndex(int nHash,
int cBuckets)
Calculate the bucket number for a particular hash code.
|
SafeHashMap.Entry<K,V> |
getEntry(Object key)
Locate an Entry in the hash map based on its key.
|
protected SafeHashMap.Entry<K,V> |
getEntryInternal(Object oKey)
Locate an Entry in the hash map based on its key.
|
protected AtomicReferenceArray<SafeHashMap.Entry> |
getStableBucketArray()
Get the bucket array, or if a resize is occurring, wait for the resize
to complete and return the new bucket array.
|
protected void |
grow()
Resize the bucket array, rehashing all Entries.
|
protected SafeHashMap.Entry<K,V> |
instantiateEntry()
Factory pattern: instantiate an un-initialized Entry object.
|
protected SafeHashMap.Entry<K,V> |
instantiateEntry(K oKey,
V oValue,
int iHash)
Factory pattern: instantiate initialized Entry object.
|
protected SafeHashMap.EntrySet |
instantiateEntrySet()
Factory pattern.
|
protected SafeHashMap.KeySet |
instantiateKeySet()
Factory pattern.
|
protected SafeHashMap.ValuesCollection |
instantiateValuesCollection()
Factory pattern.
|
protected boolean |
isActiveIterator()
Determine if there are any active Iterators, which may mean that they
are in the middle of iterating over the Map.
|
boolean |
isEmpty()
Returns true if this map contains no key-value mappings.
|
protected void |
iteratorActivated(Iterator iter)
Register the activation of an Iterator.
|
protected void |
iteratorDeactivated(Iterator iter)
Unregister the (formerly active) Iterator.
|
Set<K> |
keySet()
Returns a Set view of the keys contained in this map.
|
V |
put(K key,
V value)
Associates the specified value with the specified key in this map.
|
V |
remove(Object oKey)
Removes the mapping for this key from this map if present.
|
protected void |
removeEntryInternal(SafeHashMap.Entry<K,V> entry)
Removes the passed Entry from the map.
|
int |
size()
Returns the number of key-value mappings in this map.
|
Collection<V> |
values()
Returns a collection view of the values contained in this map.
|
containsValue, equals, hashCode, putAll, toString
finalize, getClass, notify, notifyAll, wait, wait, wait
compute, computeIfAbsent, computeIfPresent, forEach, getOrDefault, merge, putIfAbsent, remove, replace, replace, replaceAll
public static final int DEFAULT_INITIALSIZE
protected static final int BIGGEST_MODULO
public static final float DEFAULT_LOADFACTOR
public static final float DEFAULT_GROWTHRATE
protected Object RESIZING
Due to custom serialization this field cannot be marked as "final", but must be treated as such.
protected volatile int m_cEntries
protected volatile AtomicReferenceArray<SafeHashMap.Entry> m_aeBucket
protected int m_cCapacity
protected float m_flLoadFactor
protected float m_flGrowthRate
protected transient SafeHashMap.EntrySet m_setEntries
protected transient SafeHashMap.KeySet m_setKeys
protected transient SafeHashMap.ValuesCollection m_colValues
protected transient Object m_oIterActive
public SafeHashMap()
public SafeHashMap(int cInitialBuckets, float flLoadFactor, float flGrowthRate)
cInitialBuckets
- the initial number of hash buckets, 0 < nflLoadFactor
- the acceptable load factor before resizing
occurs, 0 < n, such that a load factor of
1.0 causes resizing when the number of entries
exceeds the number of bucketsflGrowthRate
- the rate of bucket growth when a resize occurs,
0 < n, such that a growth rate of 1.0 will
double the number of buckets:
bucketCount = bucketCount * (1 + growthRate)public int size()
This method is not synchronized; it returns the size at the moment that the method is invoked. To ensure that the size does not change from the returned value, the caller must synchronize on the map before calling the size method.
public boolean isEmpty()
This method is not synchronized; it returns the state of the map at the moment that the method is invoked. To ensure that the size does not change, the caller must synchronize on the map before calling the method.
public boolean containsKey(Object key)
This method is not synchronized; it returns true if the map contains the key at the moment that the method is invoked. To ensure that the key is still in (or is still not in) the table when the method returns, the caller must synchronize on the map before calling the method.
containsKey
in interface Map<K,V>
containsKey
in class AbstractMap<K,V>
key
- key whose presence in this map is to be testedpublic V get(Object key)
public SafeHashMap.Entry<K,V> getEntry(Object key)
key
- the key object to search forpublic V put(K key, V value)
This method is not synchronized; it only synchronizes internally if it has to add a new Entry. To ensure that the value does not change (or the Entry is not removed) before this method returns, the caller must synchronize on the map before calling this method.
put
in interface Map<K,V>
put
in class AbstractMap<K,V>
key
- key with which the specified value is to be associatedvalue
- value to be associated with the specified keyprotected void grow()
public V remove(Object oKey)
remove
in interface Map<K,V>
remove
in class AbstractMap<K,V>
oKey
- key whose mapping is to be removed from the mappublic void clear()
public Set<Map.Entry<K,V>> entrySet()
public Set<K> keySet()
public Collection<V> values()
public Object clone()
clone
in class AbstractMap<K,V>
protected SafeHashMap.Entry cloneEntryList(SafeHashMap.Entry entryThat)
This method must be called on the map that will contain the clones, to allow the map to be the parent of the entries if the entries are not static inner classes.
entryThat
- the entry that is the head of the list to cloneprotected SafeHashMap.Entry<K,V> getEntryInternal(Object oKey)
Unlike the getEntry(java.lang.Object)
method, there must be no side-effects of
calling this method.
oKey
- the key object to search forprotected void removeEntryInternal(SafeHashMap.Entry<K,V> entry)
Note: Unlike calling the "remove" method, which is overridden at subclasses, calling this method directly does not generate any events.
entry
- the entry to remove from this mapprotected int getBucketIndex(int nHash, int cBuckets)
nHash
- the hash codecBuckets
- the number of bucketsprotected AtomicReferenceArray<SafeHashMap.Entry> getStableBucketArray()
protected void iteratorActivated(Iterator iter)
iter
- the activated iteratorprotected void iteratorDeactivated(Iterator iter)
iter
- the deactivated iteratorprotected boolean isActiveIterator()
protected SafeHashMap.Entry<K,V> instantiateEntry(K oKey, V oValue, int iHash)
oKey
- the keyoValue
- the valueiHash
- the hash valueprotected SafeHashMap.Entry<K,V> instantiateEntry()
protected SafeHashMap.EntrySet instantiateEntrySet()
protected SafeHashMap.KeySet instantiateKeySet()
protected SafeHashMap.ValuesCollection instantiateValuesCollection()