Java中HashMap和Hashtable有什么区别

Java中HashMap与Hashtable的区别

HashMap和Hashtable都实现了Map接口,可是在决定在Java中是否使用HashMap或Hashtable以前,它们之间有一些重要的区别,这一点很重要。其中一些是线程安全、同步和速度。如下是这些不一样之处:安全

1.HashMap类大体至关于哈希表,但它是非同步的,而且容许空值。(HashMap容许空值做为键和值,而哈希表不容许空)。并发

2.主要之一HashMap与Hashtable的区别是HashMap是非同步的,而Hashtable是同步的,这意味着哈希表线程安全,能够在多个线程之间共享,可是HashMap若是没有适当的同步,就不能在多个线程之间共享。Java 5介绍ConcurrentHashMap它是Hashtable的另外一种选择,它提供了比Java中的Hashtable更好的可伸缩性。
 ide

HashMap vs Hashtable in Java

 

3.HashMap和Hashtable之间的另外一个显著区别是,HashMap中的迭代器是失败快速迭代器,而Hashtable的枚举器不是,若是任何其余线程经过添加或删除Iterator本身的remove()方法以外的任何元素在结构上修改映射,则抛出ConcurrentModificationException。可是这不是一种有保证的行为,JVM将尽最大努力来完成。这也是Java中枚举和迭代器之间的一个重要区别。性能

4. Hashtable和HashMap之间一个更显著的区别是,因为线程安全性和同步性,若是在单线程环境中使用,Hashtable比HashMap慢得多。所以,若是您不须要同步,而且HashMap仅由一个线程使用,那么它的性能将优于Java中的Hashtable。线程

5. HashMap不能保证映射的顺序在一段时间内保持不变。对象

HashMap和Hashtable:关于一些重要术语的说明

1)Synchronized是指在一个时间点上只有一个线程能够修改哈希表。基本上,这意味着在对哈希表执行更新以前,任何线程都必须得到对象上的锁,而其余线程将等待该锁被释放。接口

2)故障安全与迭代器的上下文相关。若是在集合对象上建立了迭代器或ListIterator,而其余线程试图“结构化地”修改集合对象,则会引起并发修改异常。不过,其余线程也能够调用“set”方法,由于它不会“在结构上”修改集合。可是,若是在调用“set”以前在结构上修改了集合,则会抛出“IllegalArgumentException”。rem

Difference between HashMap and Hashtable in Java

3)结构修改是指删除或插入能够有效改变地图结构的元素。同步

HashMap能够经过如下方式同步hash

Map m = Collections.synchronizeMap(hashMap);

总之,Hashtable和HashMap在Java中有很大的区别,例如线程安全性和速度,而且只有在绝对须要线程安全性(若是运行Java 5)的状况下才使用Hashtable,那么能够考虑在Java中使用ConcurrentHashMap。

相关文章
相关标签/搜索