Java中HashMap和Hashtable之间的区别是什么?

对于非线程应用程序,哪个更有效?


当前回答

HashTable是jdk中的一个遗留类,不应再使用。将其用法替换为ConcurrentHashMap。如果您不需要线程安全,请使用HashMap,它不是线程安全的,但速度更快,占用的内存更少。

其他回答

请记住,HashTable是在引入Java集合框架(JCF)之前的遗留类,后来经过了修改以实现Map接口。Vector和Stack也是如此。

因此,在新代码中始终远离它们,因为正如其他人所指出的,JCF中总是有更好的替代方案。

这是Java集合备忘单,您会发现它很有用。请注意,灰色块包含旧类HashTable、Vector和Stack。

HashMap:它是java.util包中可用的类,用于以键和值格式存储元素。

Hashtable:它是一个在集合框架中被识别的遗留类。

hashtable和hashmap之间的另一个关键区别是,hashmap中的Iterator是快速失败的,而hashtable的枚举器不是快速失败的。如果任何其他线程通过添加或删除Iterator自己的remove()方法以外的任何元素来从结构上修改映射,则抛出ConcurrentModificationException。但这不是一种保证的行为,将由JVM尽最大努力完成。"

我的来源:http://javarevisited.blogspot.com/2010/10/difference-between-hashmap-and.html

Hashtable类是同步的,也就是说,它被设计用于处理多线程或多线程进程的应用程序。在应用程序到进程的经典情况下,同步类的效率较低,因此Hashmap类通常更快。HashTable类不接受Null值(对于键或值),而HashMap类允许单个键为Null,并尽可能多地为Null。

古老而经典的主题,只想添加一个有用的博客来解释这一点:

http://blog.manishchhabra.com/2012/08/the-5-main-differences-betwen-hashmap-and-hashtable/

博客作者:Manish Chhabra

HashMap和Hashtable之间的5个主要区别HashMap和Hashtable都实现java.util.Map接口Java开发人员编写时必须了解一些差异更高效的代码。从Java 2平台v1.2开始,Hashtable类被改装以实现Map接口,使其成为Java集合框架。HashMap和Hashtable之间的主要区别之一是HashMap是非同步的,而Hashtable是同步的表示Hashtable是线程安全的,可以在多个线程,但HashMap不能在多个线程之间共享正确的同步。Java 5引入了ConcurrentHashMapHashtable的替代方案,提供了比Hashtable更好的可扩展性Java中的哈希表。同步意味着只有一个线程可以修改哈希在某个时间点。基本上,这意味着之前的任何线程对哈希表执行更新必须获取对象,而其他人将等待释放锁定。HashMap类大致等同于Hashtable,只是它允许空值。(HashMap允许空值作为键和值,而哈希表不允许空值)。HashMap与Hashtable之间的第三个显著区别是HashMap中的迭代器是一个快速失败迭代器,而Hashtable的枚举器不是和抛出如果任何其他线程修改映射,则并发修改异常通过添加或删除除迭代器自身元素之外的任何元素,在结构上remove()方法。但这不是一种保证行为由JVM尽最大努力完成。这也是一个重要的区别在Java中枚举和迭代器之间。Hashtable和HashMap之间的一个更显著的区别是,由于线程安全和同步,Hashtable要慢得多如果在单线程环境中使用,则比HashMap更好。所以如果你不需要同步,HashMap仅由一个线程使用在Java中执行Hashtable。HashMap不能保证映射的顺序随时间保持不变。注意HashMap可以通过Map m=Collections.synchronizedMap(hashMap);总之,Hashtable和Java中的HashMap,例如线程安全性和速度,仅基于此如果您绝对需要线程安全,请使用HashtableJava5考虑在Java中使用ConcurrentHashMap。