HashMap 与Hashtable的区别?
-
线程安全
Hashtable是线程安全的,HashMap 不是线程安全的。
Hashtable 所有的元素操作都是synchronized修饰的
而HashMap并没有 -
性能优劣
既然Hashtable是线程安全的,每个方法都要阻塞其他线程,所以Hashtable性能较差,HashMap性能较好,使用更广。
如果要线程安全又要保证性能,建议使用JUC包下的ConcurrentHashMap. -
NUll
Hashtable是不允许键值为null
HashMap的键值都可以为null -
实现方式
Hashtable继承了Dictionary类
HashMap继承的是AbstractMap类 -
容量扩容
HashMap的初始容量为 16
hashtable的初始容量为 11
两者的负载因子默认都是 0.75
当现有容量大于总容量 * 负载因子时,HashMap扩容规则为当前容量的翻倍,Hashtable扩容为当前容量翻倍+1 -
迭代器
HashMap 中的 lterator迭代器是fail-fast 的
Hashtable 的 Enumerator 不是 fail-fast的
所以,当其他线程改变了HashMap 的结构,如:增加、删除元素,将会抛出ConcurrentModificationException异常,而Hashtable 则不会。