Package org.apache.xbean.propertyeditor
Class ReferenceIdentityMap
- java.lang.Object
-
- org.apache.xbean.propertyeditor.ReferenceIdentityMap
-
- All Implemented Interfaces:
java.util.Map
public class ReferenceIdentityMap extends java.lang.Object implements java.util.Map
Streamlined version of a WeakIdentityHashMap. Provides Identity semantics with Weak References to keys. This allows proxies to be GC'ed when no longer referenced by clients.BasicProxymanager.destroyProxy()
need not be invoked when a proxy is no longer needed. Note that this is not a full Map implementation. The iteration and collection capabilities of Map have been discarded to keep the implementation lightweight.Much of this code was cribbed from the Commons Collection 3.1 implementation of
ReferenceIdentityMap
andAbstractReferenceMap
.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description private static class
ReferenceIdentityMap.ReferenceEntry
Each entry in the Map is represented with a ReferenceEntry.
-
Field Summary
Fields Modifier and Type Field Description private ReferenceIdentityMap.ReferenceEntry[]
data
Map entriesprivate static int
DEFAULT_CAPACITY
The default capacity to use.private static float
DEFAULT_LOAD_FACTOR
The default load factor to useprivate float
loadFactor
Load factor, normally 0.75private static int
MAXIMUM_CAPACITY
The maximum capacity allowedprivate java.lang.ref.ReferenceQueue
purgeQueue
ReferenceQueue used to eliminate GC'ed entries.private int
size
The size of the mapprivate int
threshold
Size at which to rehash
-
Constructor Summary
Constructors Constructor Description ReferenceIdentityMap()
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description private int
calculateThreshold(int newCapacity, float factor)
Calculates the new threshold of the map, where it will be resized.private void
checkCapacity()
Checks the capacity of the map and enlarges it if necessary.void
clear()
Clears the map, resetting the size to zero and nullifying references to avoid garbage collection issues.boolean
containsKey(java.lang.Object key)
Checks whether the map contains the specified key.boolean
containsValue(java.lang.Object value)
Checks whether the map contains the specified value.private ReferenceIdentityMap.ReferenceEntry
createEntry(int index, int hashCode, java.lang.Object key, java.lang.Object value)
Creates a new ReferenceEntry.private void
ensureCapacity(int newCapacity)
Changes the size of the data structure to the capacity proposed.java.util.Set
entrySet()
java.lang.Object
get(java.lang.Object key)
Gets the value mapped to the key specified.private ReferenceIdentityMap.ReferenceEntry
getEntry(java.lang.Object key)
Gets the entry mapped to the key specified.private int
hash(java.lang.Object key)
Gets the hash code for the key specified.private int
hashIndex(int hashCode, int dataSize)
Gets the index into the data storage for the hashCode specified.boolean
isEmpty()
Checks whether the map is currently empty.java.util.Set
keySet()
private void
purge()
Purges stale mappings from this map.private void
purge(java.lang.ref.Reference purgedEntry)
Purges the specified reference.java.lang.Object
put(java.lang.Object key, java.lang.Object value)
Puts a key-value entry into this map.void
putAll(java.util.Map t)
java.lang.Object
remove(java.lang.Object key)
Removes the specified mapping from this map.private void
removeEntry(ReferenceIdentityMap.ReferenceEntry entry, int hashIndex, ReferenceIdentityMap.ReferenceEntry previous)
Removes an entry from the chain stored in a particular index.int
size()
Gets the size of the map.java.util.Collection
values()
-
-
-
Field Detail
-
DEFAULT_CAPACITY
private static final int DEFAULT_CAPACITY
The default capacity to use. Always use a power of 2!!!- See Also:
- Constant Field Values
-
DEFAULT_LOAD_FACTOR
private static final float DEFAULT_LOAD_FACTOR
The default load factor to use- See Also:
- Constant Field Values
-
MAXIMUM_CAPACITY
private static final int MAXIMUM_CAPACITY
The maximum capacity allowed- See Also:
- Constant Field Values
-
loadFactor
private float loadFactor
Load factor, normally 0.75
-
size
private transient int size
The size of the map
-
data
private transient ReferenceIdentityMap.ReferenceEntry[] data
Map entries
-
threshold
private transient int threshold
Size at which to rehash
-
purgeQueue
private java.lang.ref.ReferenceQueue purgeQueue
ReferenceQueue used to eliminate GC'ed entries.
-
-
Method Detail
-
size
public int size()
Gets the size of the map.- Specified by:
size
in interfacejava.util.Map
- Returns:
- the size
-
isEmpty
public boolean isEmpty()
Checks whether the map is currently empty.- Specified by:
isEmpty
in interfacejava.util.Map
- Returns:
- true if the map is currently size zero
-
containsKey
public boolean containsKey(java.lang.Object key)
Checks whether the map contains the specified key.- Specified by:
containsKey
in interfacejava.util.Map
- Parameters:
key
- the key to search for- Returns:
- true if the map contains the key
-
containsValue
public boolean containsValue(java.lang.Object value)
Checks whether the map contains the specified value.- Specified by:
containsValue
in interfacejava.util.Map
- Parameters:
value
- the value to search for- Returns:
- true if the map contains the value
-
get
public java.lang.Object get(java.lang.Object key)
Gets the value mapped to the key specified.- Specified by:
get
in interfacejava.util.Map
- Parameters:
key
- the key- Returns:
- the mapped value, null if no match
-
put
public java.lang.Object put(java.lang.Object key, java.lang.Object value)
Puts a key-value entry into this map. Neither the key nor the value may be null.- Specified by:
put
in interfacejava.util.Map
- Parameters:
key
- the key to add, must not be nullvalue
- the value to add, must not be null- Returns:
- the value previously mapped to this key, null if none
-
remove
public java.lang.Object remove(java.lang.Object key)
Removes the specified mapping from this map.- Specified by:
remove
in interfacejava.util.Map
- Parameters:
key
- the mapping to remove- Returns:
- the value mapped to the removed key, null if key not in map
-
clear
public void clear()
Clears the map, resetting the size to zero and nullifying references to avoid garbage collection issues.- Specified by:
clear
in interfacejava.util.Map
-
values
public java.util.Collection values()
- Specified by:
values
in interfacejava.util.Map
-
putAll
public void putAll(java.util.Map t)
- Specified by:
putAll
in interfacejava.util.Map
-
entrySet
public java.util.Set entrySet()
- Specified by:
entrySet
in interfacejava.util.Map
-
keySet
public java.util.Set keySet()
- Specified by:
keySet
in interfacejava.util.Map
-
getEntry
private ReferenceIdentityMap.ReferenceEntry getEntry(java.lang.Object key)
Gets the entry mapped to the key specified.- Parameters:
key
- the key- Returns:
- the entry, null if no match
-
createEntry
private ReferenceIdentityMap.ReferenceEntry createEntry(int index, int hashCode, java.lang.Object key, java.lang.Object value)
Creates a new ReferenceEntry.- Parameters:
index
- the index into the data maphashCode
- the hash code for the new entrykey
- the key to storevalue
- the value to store- Returns:
- the newly created entry
-
removeEntry
private void removeEntry(ReferenceIdentityMap.ReferenceEntry entry, int hashIndex, ReferenceIdentityMap.ReferenceEntry previous)
Removes an entry from the chain stored in a particular index.This implementation removes the entry from the data storage table. The size is not updated.
- Parameters:
entry
- the entry to removehashIndex
- the index into the data structureprevious
- the previous entry in the chain
-
checkCapacity
private void checkCapacity()
Checks the capacity of the map and enlarges it if necessary.This implementation uses the threshold to check if the map needs enlarging
-
ensureCapacity
private void ensureCapacity(int newCapacity)
Changes the size of the data structure to the capacity proposed.- Parameters:
newCapacity
- the new capacity of the array (a power of two, less or equal to max)
-
calculateThreshold
private int calculateThreshold(int newCapacity, float factor)
Calculates the new threshold of the map, where it will be resized. This implementation uses the load factor.- Parameters:
newCapacity
- the new capacityfactor
- the load factor- Returns:
- the new resize threshold
-
hash
private int hash(java.lang.Object key)
Gets the hash code for the key specified.This implementation uses the identity hash code.
- Parameters:
key
- the key to get a hash code for- Returns:
- the hash code
-
hashIndex
private int hashIndex(int hashCode, int dataSize)
Gets the index into the data storage for the hashCode specified. This implementation uses the least significant bits of the hashCode.- Parameters:
hashCode
- the hash code to usedataSize
- the size of the data to pick a bucket from- Returns:
- the bucket index
-
purge
private void purge()
Purges stale mappings from this map.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.
-
purge
private void purge(java.lang.ref.Reference purgedEntry)
Purges the specified reference.- Parameters:
purgedEntry
- the reference to purge
-
-