HengYk Blog

个人站

具有浪漫主义情调的理想主义务实青年


JDK1.7的HashTable

参考博文

Hashtable 的实现原理

构造方法
// JDK1.7和JDK1.8
public class Hashtable<K,V>
    extends Dictionary<K,V>
    implements Map<K,V>, Cloneable, java.io.Serializable
    public Hashtable() {
        this(11, 0.75f);
    }
    public Hashtable(int initialCapacity, float loadFactor) {
        if (initialCapacity < 0)
            throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity);
        if (loadFactor <= 0 || Float.isNaN(loadFactor))
            throw new IllegalArgumentException("Illegal Load:     "+ loadFactor);

        if (initialCapacity==0)
            initialCapacity = 1;

        this.loadFactor = loadFactor;
        table = new Entry[initialCapacity];
        threshold = (int)Math.min(initialCapacity * loadFactor, MAX_ARRAY_SIZE + 1);

        initHashSeedAsNeeded(initialCapacity);
    }
Put方法
    public synchronized V put(K key, V value) {
        // Make sure the value is not null
        // 值不能为空
        if (value == null) {
            throw new NullPointerException();
        }

        // Makes sure the key is not already in the hashtable.
        Entry tab[] = table;
        int hash = hash(key);
        int index = (hash & 0x7FFFFFFF) % tab.length;
        for (Entry<K,V> e = tab[index] ; e != null ; e = e.next) {
            if ((e.hash == hash) && e.key.equals(key)) {
                V old = e.value;
                e.value = value;
                return old;
            }
        }

        modCount++;
        if (count >= threshold) {
            // Rehash the table if the threshold is exceeded
            rehash();

            tab = table;
            hash = hash(key);
            index = (hash & 0x7FFFFFFF) % tab.length;
        }

        // Creates the new entry.
        Entry<K,V> e = tab[index];
        tab[index] = new Entry<>(hash, key, value, e);
        count++;
        return null;
    }
Get方法
    public synchronized V get(Object key) {
        Entry tab[] = table;
        int hash = hash(key);
        int index = (hash & 0x7FFFFFFF) % tab.length;
        for (Entry<K,V> e = tab[index] ; e != null ; e = e.next) {
            if ((e.hash == hash) && e.key.equals(key)) {
                return e.value;
            }
        }
        return null;
    }
HashMap和HashTable的对比

1.HashTable 基于 Dictionary 类,而 HashMap 是基于 AbstractMap。

public class HashMap<K,V>
    extends AbstractMap<K,V>
    implements Map<K,V>, Cloneable, Serializable

2.HashMap 的 key 和 value 都允许为 null,

而 Hashtable 的 key 和 value 都不允许为 null。

// 空键处理逻辑
if (key == null)
    return putForNullKey(value);
// Make sure the value is not null
if (value == null) {
    throw new NullPointerException();
}

3.Hashtable 方法是同步,而HashMap则不是。

// HashTable
public synchronized V put(K key, V value)

public synchronized V get(Object key)

public synchronized V remove(Object key)
// HashMap
public V put(K key, V value)

public V get(Object key)

public V remove(Object key)