java.util.Hashtable源码分析

Hashtable实现一个键值映射的表。任何非null的object可以用作key和value。

为了能存取对象,放在表里的对象必须实现hashCode和equals方法。

一个Hashtable有两个参数影响,initial capacity和load factor。

Hashtable是同步化的,如果不需要线程安全的特性,建议使用HashMap,如果需要高度线程安全的特性,建议使用java.util.concurrent.ConcurrentHashMap。也就是说,Hashtable已经算是一个废弃的状态,还存在的意义是为了已经使用了Hashtable的程序能够继续使用,新程序不应该再使用它了。

 

public class Hashtable<K,V>
    extends Dictionary<K,V>
    implements Map<K,V>, Cloneable, java.io.Serializable {

Dictionary是个被废弃的抽象类,从这里也可以看出为什么Hashtable不再被建议使用了。

 

Hashtable保证快速失败的机制使用一个modCount的变量。

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);
}

public Hashtable(int initialCapacity) {
        this(initialCapacity, 0.75f);
}

public Hashtable() {
        this(11, 0.75f);
}

public Hashtable(Map<? extends K, ? extends V> t) {
        this(Math.max(2*t.size(), 11), 0.75f);
        putAll(t);
}

Hashtable的四个构造器,可以看出,它默认的容量大小是11,默认阀值是0.75,(HashMap是16和0.75)。

对Hashtable的操作就不需要再说了,和HashMap的实现功能都差不多,只是实现的细节有很大的差别。

posted @ 2016-08-06 17:56  没有梦想的小灰灰  阅读(173)  评论(0编辑  收藏  举报