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的实现功能都差不多,只是实现的细节有很大的差别。