home *** CD-ROM | disk | FTP | other *** search
- package Acme;
-
- import java.util.Dictionary;
- import java.util.Enumeration;
-
- public class IntHashtable extends Dictionary implements Cloneable {
- private IntHashtableEntry[] table;
- private int count;
- private int threshold;
- private float loadFactor;
-
- public IntHashtable(int initialCapacity, float loadFactor) {
- if (initialCapacity > 0 && !((double)loadFactor <= (double)0.0F)) {
- this.loadFactor = loadFactor;
- this.table = new IntHashtableEntry[initialCapacity];
- this.threshold = (int)((float)initialCapacity * loadFactor);
- } else {
- throw new IllegalArgumentException();
- }
- }
-
- public IntHashtable(int initialCapacity) {
- this(initialCapacity, 0.75F);
- }
-
- public IntHashtable() {
- this(101, 0.75F);
- }
-
- public int size() {
- return this.count;
- }
-
- public boolean isEmpty() {
- return this.count == 0;
- }
-
- public synchronized Enumeration keys() {
- return new IntHashtableEnumerator(this.table, true);
- }
-
- public synchronized Enumeration elements() {
- return new IntHashtableEnumerator(this.table, false);
- }
-
- public synchronized boolean contains(Object value) {
- if (value == null) {
- throw new NullPointerException();
- } else {
- IntHashtableEntry[] tab = this.table;
- int i = tab.length;
-
- while(i-- > 0) {
- for(IntHashtableEntry e = tab[i]; e != null; e = e.next) {
- if (e.value.equals(value)) {
- return true;
- }
- }
- }
-
- return false;
- }
- }
-
- public synchronized boolean containsKey(int key) {
- IntHashtableEntry[] tab = this.table;
- int hash = key;
- int index = (key & Integer.MAX_VALUE) % tab.length;
-
- for(IntHashtableEntry e = tab[index]; e != null; e = e.next) {
- if (e.hash == hash && e.key == key) {
- return true;
- }
- }
-
- return false;
- }
-
- public synchronized Object get(int key) {
- IntHashtableEntry[] tab = this.table;
- int hash = key;
- int index = (key & Integer.MAX_VALUE) % tab.length;
-
- for(IntHashtableEntry e = tab[index]; e != null; e = e.next) {
- if (e.hash == hash && e.key == key) {
- return e.value;
- }
- }
-
- return null;
- }
-
- public Object get(Object okey) {
- if (!(okey instanceof Integer)) {
- throw new InternalError("key is not an Integer");
- } else {
- Integer ikey = (Integer)okey;
- int key = ikey;
- return this.get(key);
- }
- }
-
- protected void rehash() {
- int oldCapacity = this.table.length;
- IntHashtableEntry[] oldTable = this.table;
- int newCapacity = oldCapacity * 2 + 1;
- IntHashtableEntry[] newTable = new IntHashtableEntry[newCapacity];
- this.threshold = (int)((float)newCapacity * this.loadFactor);
- this.table = newTable;
- int i = oldCapacity;
-
- IntHashtableEntry e;
- int index;
- while(i-- > 0) {
- for(IntHashtableEntry old = oldTable[i]; old != null; newTable[index] = e) {
- e = old;
- old = old.next;
- index = (e.hash & Integer.MAX_VALUE) % newCapacity;
- e.next = newTable[index];
- }
- }
-
- }
-
- public synchronized Object put(int key, Object value) {
- if (value == null) {
- throw new NullPointerException();
- } else {
- IntHashtableEntry[] tab = this.table;
- int hash = key;
- int index = (key & Integer.MAX_VALUE) % tab.length;
-
- for(IntHashtableEntry e = tab[index]; e != null; e = e.next) {
- if (e.hash == hash && e.key == key) {
- Object old = e.value;
- e.value = value;
- return old;
- }
- }
-
- if (this.count >= this.threshold) {
- this.rehash();
- return this.put(key, value);
- } else {
- IntHashtableEntry e = new IntHashtableEntry();
- e.hash = hash;
- e.key = key;
- e.value = value;
- e.next = tab[index];
- tab[index] = e;
- ++this.count;
- return null;
- }
- }
- }
-
- public Object put(Object okey, Object value) {
- if (!(okey instanceof Integer)) {
- throw new InternalError("key is not an Integer");
- } else {
- Integer ikey = (Integer)okey;
- int key = ikey;
- return this.put(key, value);
- }
- }
-
- public synchronized Object remove(int key) {
- IntHashtableEntry[] tab = this.table;
- int hash = key;
- int index = (key & Integer.MAX_VALUE) % tab.length;
- IntHashtableEntry e = tab[index];
-
- for(IntHashtableEntry prev = null; e != null; e = e.next) {
- if (e.hash == hash && e.key == key) {
- if (prev != null) {
- prev.next = e.next;
- } else {
- tab[index] = e.next;
- }
-
- --this.count;
- return e.value;
- }
-
- prev = e;
- }
-
- return null;
- }
-
- public Object remove(Object okey) {
- if (!(okey instanceof Integer)) {
- throw new InternalError("key is not an Integer");
- } else {
- Integer ikey = (Integer)okey;
- int key = ikey;
- return this.remove(key);
- }
- }
-
- public synchronized void clear() {
- IntHashtableEntry[] tab = this.table;
- int index = tab.length;
-
- while(true) {
- --index;
- if (index < 0) {
- this.count = 0;
- return;
- }
-
- tab[index] = null;
- }
- }
-
- public synchronized Object clone() {
- try {
- IntHashtable t = (IntHashtable)super.clone();
- t.table = new IntHashtableEntry[this.table.length];
-
- for(int i = this.table.length; i-- > 0; t.table[i] = this.table[i] != null ? (IntHashtableEntry)this.table[i].clone() : null) {
- }
-
- return t;
- } catch (CloneNotSupportedException var3) {
- throw new InternalError();
- }
- }
-
- public synchronized String toString() {
- int max = this.size() - 1;
- StringBuffer buf = new StringBuffer();
- Enumeration k = this.keys();
- Enumeration e = this.elements();
- buf.append("{");
-
- for(int i = 0; i <= max; ++i) {
- String s1 = k.nextElement().toString();
- String s2 = e.nextElement().toString();
- buf.append(s1 + "=" + s2);
- if (i < max) {
- buf.append(", ");
- }
- }
-
- buf.append("}");
- return buf.toString();
- }
- }
-