Hashtable和HashMap都是Map接口的实现类,方法是一样的,实现也差不多,主要说下不同
*Hashtable线程安全,HashMap非线程安全。
Hashtable主要是在各个关键操作(put、putAll、get等)加了synchronized关键字来保证线程安全。这样也导致了Hashtable效率要低些。因为n个线程都会抢一把锁,无论读或者写,抢到的线程进行操作,抢不到的只能等了。
*Hashtable不允许null值,HashMap允许
//Hashtable的put操作
public synchronized V put(K key, V value) {
// Make sure the value is not null
if (value == null) {
throw new NullPointerException();
}
...
}
*Hashtable继承了Dictionary,HashMap则继承了AbstractMap,据说是因为历史原因(Hashtable从jdk1.0就有了,HashMap到1.2才有的)
public class Hashtable<K,V>
extends Dictionary<K,V>
implements Map<K,V>, Cloneable, java.io.Serializable {
...
}
public class HashMap<K,V>
extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable{
...
}
*数组下标bucketIndex计算方式不同
HashMap是让hash值与(length-1)进行&运算获得
static int indexFor(int h, int length) {
return h & (length-1);
}
Hashtable是进行取余获的,前面的&运算是为了保证值为正数(如果本身就是正数,计算的结果和原本的hash值是一样的),再进行取余
index = (hash & 0x7FFFFFFF) % tab.length;