(1)HashMap是非线程安全的,Hashtable是线程安全的
以get()方法为例
HashMap:
public V get(Object key) {
Node<K,V> e;
return (e = getNode(hash(key), key)) == null ? null : e.value;
}
Hashtable:
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;
}
可以看见在Hashtable中get()方法加上了synchronized关键字来保证集合的线程安全性。
(2)HashMap集成自AbstractMap,Hashtable继承自Dictionary:
HashMap:
public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable
Hashtable:
public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, java.io.Serializable
其中,AbstractMap提供了Map接口的骨干实现,Dictionary是可以将键映射到值的类的抽象父类。
(3)确定数组index的方式不同:
HashMap:
static int indexFor(int h, int length) {
return h & (length-1);
}
Hashtable:
int index = (hash & 0x7FFFFFFF) % tab.length;
(4)HashMap允许key和value都为null,Hashtable不允许为null
(5)HashMap允许通过Iterator遍历,Hashtable允许Iterator和Enumeration遍历