/*******************************************************************************
* Copyright (c) 2000, 2008 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package java.util;
public class Hashtable implements Map {
int elementCount;
Entry[] elementData;
private int limit;
private static class Entry {
Object key, value;
Entry next;
}
public Hashtable() {
this(10);
}
public Hashtable(int initialCapacity) {
if (initialCapacity < 0) throw new IllegalArgumentException();
elementData = new Entry[initialCapacity];
limit = elementData.length * 3 / 4;
}
public void clear() {
for (int i = 0; i < elementData.length; i++) {
elementData[i] = null;
}
elementCount = 0;
}
public boolean contains(Object value) {
if (value == null) throw new NullPointerException();
for (int i = 0; i < elementData.length; i++) {
Entry entry = elementData[i];
while (entry != null) {
if (value.equals(entry.value)) return true;
entry = entry.next;
}
}
return false;
}
public boolean containsKey(Object key) {
if (key == null) throw new NullPointerException();
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % elementData.length;
Entry entry = elementData[index];
while (entry != null) {
if (key.equals(entry.key)) return true;
entry = entry.next;
}
return false;
}
public Enumeration elements() {
return new Enumeration() {
int count, pos;
Entry entry;
public boolean hasMoreElements() {
return count < elementCount;
}
public Object nextElement() {
if (count >= elementCount) throw new NoSuchElementException();
while (entry == null) entry = elementData[pos++];
Object result = entry.value;
entry = entry.next;
count++;
return result;
}
};
}
public Object get(Object key) {
if (key == null) throw new NullPointerException();
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % elementData.length;
Entry entry = elementData[index];
while (entry != null) {
if (key.equals(entry.key)) return entry.value;
entry = entry.next;
}
return null;
}
public boolean isEmpty() {
return elementCount == 0;
}
public Enumeration keys() {
return new Enumeration() {
int count, pos;
Entry entry;
public boolean hasMoreElements() {
return count < elementCount;
}
public Object nextElement() {
if (count >= elementCount) throw new NoSuchElementException();
while (entry == null) entry = elementData[pos++];
Object result = entry.key;
entry = entry.next;
count++;
return result;
}
};
}
public Object put(Object key, Object value) {
if (key == null || value == null) throw new NullPointerException();
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % elementData.length;
if (elementCount > 0) {
Entry entry = elementData[index];
while (entry != null) {
if (entry.equals(key)) {
Object result = entry.value;
entry.value = value;
return result;
}
entry = entry.next;
}
}
if (elementCount++ >= limit) {
rehash();
index = (hash & 0x7FFFFFFF) % elementData.length;
}
Entry newEntry = new Entry();
Entry entry = elementData[index];
if (entry != null) newEntry.next = entry;
newEntry.key = key;
newEntry.value = value;
elementData[index] = newEntry;
return null;
}
protected void rehash() {
Entry[] newEntries = new Entry[elementData.length * 2 + 1];
for (int i = 0; i < elementData.length; i++) {
Entry entry = elementData[i];
while (entry != null) {
int hash = entry.key.hashCode();
int index = (hash & 0x7FFFFFFF) % newEntries.length;
Entry previous = newEntries[index];
Entry next = entry.next;
entry.next = previous != null ? previous : null;
newEntries[index] = entry;
entry = next;
}
}
elementData = newEntries;
limit = elementData.length * 3 / 4;
}
public Object remove(Object key) {
if (key == null) throw new NullPointerException();
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % elementData.length;
Entry entry = elementData[index], previous = null;
while (entry != null) {
if (key.equals(entry.key)) {
elementCount--;
if (previous == null) {
elementData[index] = entry.next;
} else {
previous.next = entry.next;
}
return entry.value;
}
previous = entry;
entry = entry.next;
}
return null;
}
public int size() {
return elementCount;
}
public String toString() {
StringBuffer buffer = new StringBuffer();
buffer.append("{");
boolean first = true;
Enumeration keys = keys();
while (keys.hasMoreElements()) {
if (!first) buffer.append(", ");
first = false;
Object key = keys.nextElement();
Object value = get(key);
buffer.append(key);
buffer.append("=");
buffer.append(value);
}
buffer.append("}");
return buffer.toString();
}
public boolean containsValue(Object value) {
return contains(value);
}
public Set entrySet() {
// TODO Auto-generated method stub
return null;
}
public Set keySet() {
// TODO Auto-generated method stub
return null;
}
public void putAll(Map t) {
// TODO Auto-generated method stub
}
public Collection values() {
// TODO Auto-generated method stub
return null;
}
}