|
What this is
Other links
The source code
/*
* WeakHashSet.java
*
* Created on September 25, 2000, 2:59 PM
*/
package org.netbeans.editor.ext.html;
import java.lang.ref.WeakReference;
/** This is a special set-like (not java.util.Set-like) class.
* It holds a set of objects referenced only weakly, and which
* can be get() by an equivalent object. It can be used e.g.
* as a lightweight (gc()-able) intern() for String or as a temporal storage
* for an algorithm creating a lot of long-lasting equals() immutables.
*
* @author Petr Nejedly
* @version 1.0
*/
public class WeakHashSet {
Entry[] data;
// count of (possibly) active Entries
int count = 0;
// Number of Entries at which we rehash
int treshold;
float loadFactor;
/** Creates new WeakHashSet */
public WeakHashSet( int capacity, float loadFactor ) {
this.loadFactor = loadFactor;
treshold = (int)(capacity * loadFactor);
data = new Entry[capacity];
}
/** Return the object equals to this object */
public Object get( Object obj ) {
if( obj == null ) return null;
Entry[] tab = data;
Entry prev = null;
int hash = obj.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
for( Entry e = tab[index]; e != null; prev = e, e = e.next )
if( e.hash == hash ) {
Object value = e.value.get();
if( value == null ) {
// remove this entry from chain
count--;
if( prev == null ) tab[index] = e.next;
else prev.next = e.next;
} else {
if( value.equals( obj ) ) return value;
}
}
return null;
}
public Object put( Object obj ) {
if( obj == null ) return null;
Entry[] tab = data;
Entry prev = null;
int hash = obj.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
for( Entry e = tab[index] ; e != null ; prev = e, e = e.next )
if( e.hash == hash ) {
Object value = e.value.get();
if( value == null ) {
count--;
if( prev == null ) tab[index] = e.next;
else prev.next = e.next;
} else {
if( value.equals( obj ) ) return value;
}
}
if( count >= treshold ) {
rehash();
tab = data;
index = (hash & 0x7FFFFFFF) % tab.length;
}
Entry e = new Entry( hash, obj, tab[index] );
tab[index] = e;
count++;
return obj;
}
private void rehash() {
int oldCapacity = data.length;
Entry oldMap[] = data;
int newCapacity = oldCapacity * 2 + 1;
Entry newMap[] = new Entry[newCapacity];
treshold = (int)(newCapacity * loadFactor);
data = newMap;
for( int i = oldCapacity ; i-- > 0 ; ) {
for( Entry old = oldMap[i] ; old != null ; ) {
Entry e = old;
old = old.next;
int index = (e.hash & 0x7FFFFFFF) % newCapacity;
e.next = newMap[index];
newMap[index] = e;
}
}
}
/**
* WeakHashSet collision list entry.
*/
private static class Entry {
int hash;
WeakReference value;
Entry next;
Entry(int hash, Object value, Entry next) {
this.hash = hash;
this.value = new WeakReference( value );
this.next = next;
}
}
}
|
| ... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.