一、类图
二、分析
a. 不允许 null key 或 null value
b. iterator is fail-fast
c. Hashtable 是同步的,但 jdk 建议使用 ConcurrentHashMap
d. Hashtable 没有强制 capacity 为 2 的整数次幂
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);
}
e. 默认大小 11,load factor 0.75
f. index 计算方法,就是求余法
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
g. 所谓线程安全,就是在方法声明中添加了 synchronized 关键字
public synchronized V get(Object key) {
Entry<?,?> tab[] = table;
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
for (Entry<?,?> e = tab[index] ; e != null ; e = e.next) {
if ((e.hash == hash) && e.key.equals(key)) {
return (V)e.value;
}
}
return null;
}
h. 扩容算法
int newCapacity = (oldCapacity << 1) + 1;
i. table 只扩不缩,HashMap 也是只扩不缩,能少 rehash 就少 rehash 吧