A Set-like class that allows looking up equivalent preexising instance.
It is useful whereever one would use self-mapping construct like
Map.put(t,t), that is, for caches, uniqueness filters or similar.
The semantics of equivalency can be external to the object, using the
Hash interface. The set also supports querying for entries using
different key type, in case you can provide a Hash implementation
that can resolve the equality.
Examples
A String cache:
Storage cache = new Storage(); // use default Hash
for (String input : data) {
String onlyOne = cache.putIfUnique(input);
....
}
Identity-based set:
Storage
An object with int ID and id-based lookup:
class Thing { int id; }
Storage things = new Storage(new Hash() {
public int getHashCode(Thing t) {
return t.id;
}
public boolean equals(Thing t1, Thing t2) {
return t1 == t2;
}
});
Map fk = things.foreignKey(new Hash() {
public int getHashCode(Integer i) {
return i.getIntValue();
}
public boolean equals(Integer k, Thing t) {
return t.id == k.getIntvalue();
}
}
things.put(new Thing(3));
assert things.get(new Thing(3)) == fk.get(3);
public Storage(int capacity,
boolean safeIterator)
Storage
public Storage(Hash<? super T,? super T> ha,
boolean safeIterator)
Storage
public Storage(Hash<? super T,? super T> ha,
int capacity)
Storage
public Storage(Hash<? super T,? super T> ha,
int capacity,
boolean safeIterator)
constructor
Parameters:
ha -
capacity -
safeIterator - If set to false, you must not modify the Storage
while iterating over it. If set to true, you can savely
modify, but the read-only iteration will happen on a copy
of the unmodified Storage.
This is similar to CopyOnWriteArrayList.