Package org.apache.sis.util.collection
Class WeakHashSet<E>
java.lang.Object
java.util.AbstractCollection<E>
java.util.AbstractSet<E>
org.apache.sis.util.collection.WeakHashSet<E>
- Type Parameters:
E
- the type of elements in the set.
- All Implemented Interfaces:
Iterable<E>
,Collection<E>
,Set<E>
,CheckedContainer<E>
A set of objects hold by weak references. An entry in a
WeakHashSet
will automatically
be removed when it is no longer in ordinary use. More precisely, the presence of an entry will
not prevent the entry from being discarded by the garbage collector, that is, made finalizable,
finalized, and then reclaimed. When an entry has been discarded it is effectively removed from
the set, so this class behaves somewhat differently than other Set
implementations.
If the elements stored in this set are arrays like int[]
, float[]
or
Object[]
, then the hash code computations and the comparisons are performed using
the static hashCode(a)
and equals(a1, a2)
methods defined in the Arrays
class.
Optimizing memory use in factory implementations
TheWeakHashSet
class has a get(Object)
method that is not part of the
Set
interface. This get
method retrieves an entry from this set
that is equal to the supplied object. The unique(Object)
method combines a
get
followed by a add
operation if the specified object was not in the set.
This is similar in spirit to the String.intern()
method. The following example shows
a convenient way to use WeakHashSet
as an internal pool of immutable objects:
Thus, WeakHashSet
can be used inside a factory to prevent creating duplicate immutable objects.
Thread safety
The sameWeakHashSet
instance can be safely used by many threads without synchronization on the part of
the caller. But if a sequence of two or more method calls need to appear atomic from other threads perspective,
then the caller can synchronize on this
.- Since:
- 0.3
- Version:
- 0.3
- See Also:
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionprivate final class
A weak reference to an element. -
Field Summary
FieldsModifier and TypeFieldDescriptionprivate static final int
The "add" operation.private int
Number of non-null elements intable
.The type of the elements in this set.private static final int
The "get" operation.private static final int
The "intern" operation.private long
The last time whentable
was not in need for rehash.private final boolean
true
if the elements in this set may be arrays.private static final int
The "remove" operation.private WeakHashSet<E>.Entry[]
Table of weak references. -
Constructor Summary
ConstructorsConstructorDescriptionWeakHashSet
(Class<E> type) Creates aWeakHashSet
for elements of the specified type. -
Method Summary
Modifier and TypeMethodDescriptionboolean
Adds the specified element to this set if it is not already present.void
clear()
Removes all of the elements from this set.boolean
Returnstrue
if this set contains the specified element.Returns an object equals to the specified object, if present.Returns the type of elements in this set.private E
Implementation of theadd(Object)
,remove(Object)
,get(Object)
,contains(Object)
andunique(Object)
methods.private boolean
isValid()
Checks if thisWeakHashSet
is valid.iterator()
Returns an iterator over the elements contained in this collection.boolean
Removes a single instance of the specified element from this set, if it is present Null values are considered never present.private void
removeEntry
(WeakHashSet<E>.Entry toRemove) Invoked byWeakHashSet<E>.Entry
when an element has been collected by the garbage collector.int
size()
Returns the count of element in this set.E[]
toArray()
Returns a view of this set as an array.<T extends E>
Tunique
(T element) Returns an object equals toelement
if such an object already exist in thisWeakHashSet
.Methods inherited from class java.util.AbstractSet
equals, hashCode, removeAll
Methods inherited from class java.util.AbstractCollection
addAll, containsAll, isEmpty, retainAll, toArray, toString
Methods inherited from class java.lang.Object
clone, finalize, getClass, notify, notifyAll, wait, wait, wait
Methods inherited from interface java.util.Collection
parallelStream, removeIf, stream, toArray
Methods inherited from interface java.util.Set
addAll, containsAll, isEmpty, retainAll, spliterator, toArray
-
Field Details
-
table
Table of weak references. -
count
private int countNumber of non-null elements intable
. This is used for determining whenWeakEntry.rehash(WeakEntry[], int, String)
needs to be invoked. -
elementType
The type of the elements in this set. -
mayContainArrays
private final boolean mayContainArraystrue
if the elements in this set may be arrays. If the elements cannot be arrays, then we can avoid the calls to the costlyUtilities
methods. -
lastTimeNormalCapacity
private transient long lastTimeNormalCapacity -
REMOVE
private static final int REMOVEThe "remove" operation.- See Also:
-
GET
private static final int GETThe "get" operation.- See Also:
-
ADD
private static final int ADDThe "add" operation.- See Also:
-
INTERN
private static final int INTERNThe "intern" operation.- See Also:
-
-
Constructor Details
-
WeakHashSet
Creates aWeakHashSet
for elements of the specified type.- Parameters:
type
- the type of the element to be included in this set.
-
-
Method Details
-
getElementType
Returns the type of elements in this set.- Specified by:
getElementType
in interfaceCheckedContainer<E>
- Returns:
- the element type.
-
removeEntry
Invoked byWeakHashSet<E>.Entry
when an element has been collected by the garbage collector. This method removes the weak reference from thetable
.- Parameters:
toRemove
- the entry to remove from this map.
-
isValid
Checks if thisWeakHashSet
is valid. This method counts the number of elements and compares it tocount
. This method is invoked in assertions only.- Returns:
- whether
count
matches the expected value.
-
size
public int size()Returns the count of element in this set.- Specified by:
size
in interfaceCollection<E>
- Specified by:
size
in interfaceSet<E>
- Specified by:
size
in classAbstractCollection<E>
- Returns:
- number of elements in this set.
-
add
Adds the specified element to this set if it is not already present. If this set already contains the specified element, the call leaves this set unchanged and returnsfalse
.- Specified by:
add
in interfaceCollection<E>
- Specified by:
add
in interfaceSet<E>
- Overrides:
add
in classAbstractCollection<E>
- Parameters:
element
- element to be added to this set.- Returns:
true
if this set did not already contain the specified element.- Throws:
NullArgumentException
- if the given object isnull
.
-
remove
Removes a single instance of the specified element from this set, if it is present Null values are considered never present.- Specified by:
remove
in interfaceCollection<E>
- Specified by:
remove
in interfaceSet<E>
- Overrides:
remove
in classAbstractCollection<E>
- Parameters:
element
- element to be removed from this set, if present. Can benull
.- Returns:
true
if the set contained the specified element.
-
get
Returns an object equals to the specified object, if present. If this set doesn't contain any object equals toelement
, then this method returnsnull
. Null values are considered never present.- Parameters:
element
- the element to get.- Returns:
- an element equals to the given one if already presents in the set,
or
null
otherwise. - See Also:
-
contains
Returnstrue
if this set contains the specified element. Null values are considered never present.- Specified by:
contains
in interfaceCollection<E>
- Specified by:
contains
in interfaceSet<E>
- Overrides:
contains
in classAbstractCollection<E>
- Parameters:
element
- object to be checked for containment in this set. Can benull
.- Returns:
true
if this set contains the specified element.
-
unique
Returns an object equals toelement
if such an object already exist in thisWeakHashSet
. Otherwise, addselement
to thisWeakHashSet
. This method is functionally equivalents to the following code:- Type Parameters:
T
- the type of the element to get. Can benull
.- Parameters:
element
- the element to get or to add in the set if not already presents, ornull
if the given element was null.- Returns:
- an element equals to the given one if already presents in the set,
or the given
object
otherwise.
-
intern
Implementation of theadd(Object)
,remove(Object)
,get(Object)
,contains(Object)
andunique(Object)
methods. -
clear
public void clear()Removes all of the elements from this set.- Specified by:
clear
in interfaceCollection<E>
- Specified by:
clear
in interfaceSet<E>
- Overrides:
clear
in classAbstractCollection<E>
-
toArray
Returns a view of this set as an array. Elements will be in an arbitrary order. Note that this array contains strong references. Consequently, no object reclamation will occur as long as a reference to this array is hold.- Specified by:
toArray
in interfaceCollection<E>
- Specified by:
toArray
in interfaceSet<E>
- Overrides:
toArray
in classAbstractCollection<E>
- Returns:
- all elements in this set.
-
iterator
Returns an iterator over the elements contained in this collection. No element from this set will be garbage collected as long as a reference to the iterator is hold.
-