HashMap和Hashtable都实现了Map接口,可是在决定在Java中是否使用HashMap或Hashtable以前,它们之间有一些重要的区别,这一点很重要。其中一些是线程安全、同步和速度。如下是这些不一样之处:安全
1.HashMap类大体至关于哈希表,但它是非同步的,而且容许空值。(HashMap容许空值做为键和值,而哈希表不容许空)。并发
2.主要之一HashMap与Hashtable的区别是HashMap是非同步的,而Hashtable是同步的,这意味着哈希表线程安全,能够在多个线程之间共享,可是HashMap若是没有适当的同步,就不能在多个线程之间共享。Java 5介绍ConcurrentHashMap它是Hashtable的另外一种选择,它提供了比Java中的Hashtable更好的可伸缩性。
ide
3.HashMap和Hashtable之间的另外一个显著区别是,HashMap中的迭代器是失败快速迭代器,而Hashtable的枚举器不是,若是任何其余线程经过添加或删除Iterator本身的remove()方法以外的任何元素在结构上修改映射,则抛出ConcurrentModificationException。可是这不是一种有保证的行为,JVM将尽最大努力来完成。这也是Java中枚举和迭代器之间的一个重要区别。性能
4. Hashtable和HashMap之间一个更显著的区别是,因为线程安全性和同步性,若是在单线程环境中使用,Hashtable比HashMap慢得多。所以,若是您不须要同步,而且HashMap仅由一个线程使用,那么它的性能将优于Java中的Hashtable。线程
5. HashMap不能保证映射的顺序在一段时间内保持不变。对象
1)Synchronized是指在一个时间点上只有一个线程能够修改哈希表。基本上,这意味着在对哈希表执行更新以前,任何线程都必须得到对象上的锁,而其余线程将等待该锁被释放。接口
2)故障安全与迭代器的上下文相关。若是在集合对象上建立了迭代器或ListIterator,而其余线程试图“结构化地”修改集合对象,则会引起并发修改异常。不过,其余线程也能够调用“set”方法,由于它不会“在结构上”修改集合。可是,若是在调用“set”以前在结构上修改了集合,则会抛出“IllegalArgumentException”。rem
3)结构修改是指删除或插入能够有效改变地图结构的元素。同步
HashMap能够经过如下方式同步hash
Map m = Collections.synchronizeMap(hashMap);
总之,Hashtable和HashMap在Java中有很大的区别,例如线程安全性和速度,而且只有在绝对须要线程安全性(若是运行Java 5)的状况下才使用Hashtable,那么能够考虑在Java中使用ConcurrentHashMap。