不同点:
1)继承的类不同
HashTable继承Dictionary
HashMap继承AbstractMap
2)初始数组大小不同
HashTable:11
HashMap:16
3)线程安全问题
HashTable:线程安全
HashMap:非线程安全
HashTable方法是同步的,而HashMap则不是。HashTable中几乎所有的public的方法都是synchronized 的,而有些方法也是在内部通过 synchronized 代码块来实现。
4)扩容的方式不同
HashTable:旧数组的2倍+1
HashMap:旧数组的2倍
HashMap的容量必须是2的指数级大小数据。当初始容量给定时,一般会自动转换成离它最近的一个2的指数的数字,作为它的容量。
5)null值处理不同
HashTable:不允许key与value为null,当用null当做Key的时候会抛出java.lang.NullPointerException异常,因为其在计算Hash的时候调用了key.hashCode();当Key为Null的时候就会抛出异常,而且在put中,并未单独对null进行判断(key不能重复)
HashMap:key可以为null,有且只有一个,value可以由多个为null。
6)hash函数不同
HashTable
private int hash(Object k) {
// hashSeed will be zero if alternative hashing is disabled.
return hashSeed ^ k.hashCode();
}
HashMap
final int hash(Object k) {
int h = hashSeed;
if (0 != h && k instanceof String) {
return sun.misc.Hashing.stringHash32((String) k);
}
h ^= k.hashCode();
h ^= (h >>> 20) ^ (h >>> 12);
return h ^ (h >>> 7) ^ (h >>> 4);
}
7)支持的遍历种类不同
HashMap只支持Iterator(迭代器)遍历。
而Hashtable支持Iterator(迭代器)和Enumeration(枚举器)两种方式遍历
8) contains()方法
Hashtable支持contains(Object value)方法,而且重写了toString()方法;
而HashMap不支持contains(Object value)方法,没有重写toString()方法。
9)效率不同
单线程下HashMap效率比HashTable效率高
相同点:
1.底层均是数组+链表2.扩容时机相同
3.继承:实现map接口,可克隆,序列化
4.重复性:key值都不能重复,value可以重复
5.迭代器都可以使用Iterator