Java中HashMap和Hashtable有什么区别

原文链接:https://javarevisited.blogspot.com/2010/10/difference-between-hashmap-and.html

Java中HashMap与Hashtable的区别

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

1.HashMap类大致相当于哈希表,但它是非同步的,并且允许空值。(HashMap允许空值作为键和值,而哈希表不允许空)。

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

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”。

扫描二维码关注公众号,回复: 5439129 查看本文章

Difference between HashMap and Hashtable in Java

3)结构修改是指删除或插入可以有效改变地图结构的元素。

HashMap可以通过以下方式同步

Map m = Collections.synchronizeMap(hashMap);

总之,Hashtable和HashMap在Java中有很大的区别,例如线程安全性和速度,并且只有在绝对需要线程安全性(如果运行Java 5)的情况下才使用Hashtable,那么可以考虑在Java中使用ConcurrentHashMap。


 

猜你喜欢

转载自blog.csdn.net/lihua5419/article/details/87691965