Hashtable类简介
java version "1.7.0_67"
Hashtable类继承了Dictionary抽象类,实现了Map、Cloneable、java.io.Serializable接口,它的底层实现原理和HashMap类是差不多的。Hashtable类最大的一个特点是:线程安全的,对外提供调用的方法都加了同步关键字Synchronized,但同时也降低了性能。插入的“键—值”都不能为null。
public class Hashtable<K,V>
extends Dictionary<K,V>
implements Map<K,V>, Cloneable, java.io.Serializable {
1.常用的构造方法HashTable(),默认初始化容量大小11,加载因子0.75
/**
* Constructs a new, empty hashtable with a default initial capacity (11)
* and load factor (0.75).
*/
public Hashtable() {
this(11, 0.75f);
}
2.HasTable中的put(K key, V value)方法,用了synchronized关键字保证线程安全
public synchronized V put(K key, V value) {
// Make sure the value is not null
if (value == null) {
//在HashTable中value不能为null,否则报空指针异常
throw new NullPointerException();
}
// Makes sure the key is not already in the hashtable.
Entry tab[] = table;
int hash = hash(key);//key为null则会报空指针异常错误
int index = (hash & 0x7FFFFFFF) % tab.length;
for (Entry<K,V> e = tab[index] ; e != null ; e = e.next) {
//哈希码值相等并且key值也相等,就会把就的value值替换成新的value值
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];
//根据索引index处存入新的entry,并且把有一个next引用指向旧的entry
//连着成一个链表,新插入的都是成为新的链表头
tab[index] = new Entry<>(hash, key, value, e);
count++;
return null;
}
可以看出hash(Object k)方法,计算哈希码值比较的简单,没有像HashMap中的那样做防碰撞处理。
private int hash(Object k) {
// hashSeed will be zero if alternative hashing is disabled.
return hashSeed ^ k.hashCode();
}
3.Hashtable 类中的内部类:Enumerator<T>,实现了接口Enumeration<T>和Iterator<T>,主要的用途是对外提供迭代器和枚举器用于遍历Hashtable中的key和value值。
总结:
当前,Hashtable在实际应用中不常用了,多线程访问下被ConcurrentHashMap类所替代了,因为它的性能比Hashtable高。