Java中HashMap和Hashtable之间的区别是什么?
对于非线程应用程序,哪个更有效?
Java中HashMap和Hashtable之间的区别是什么?
对于非线程应用程序,哪个更有效?
当前回答
HashTable是jdk中的一个遗留类,不应再使用。将其用法替换为ConcurrentHashMap。如果您不需要线程安全,请使用HashMap,它不是线程安全的,但速度更快,占用的内存更少。
其他回答
HashTable是同步的,如果您在单个线程中使用它,则可以使用HashMap,这是一个未同步的版本。未同步的对象通常性能更高。顺便说一句,如果多个线程同时访问HashMap,并且至少有一个线程在结构上修改了该映射,那么它必须在外部同步。您可以使用以下方法将未同步的映射打包到已同步的映射中:Map m=Collections.synchronizedMap(新HashMap(…));HashTable只能包含非空对象作为键或值。HashMap可以包含一个空键和空值。Map返回的迭代器是快速失败的,如果在创建迭代器之后的任何时候对映射进行了结构修改,则除了通过迭代器自己的remove方法之外,迭代器将抛出ConcurrentModificationException。因此,在并发修改的情况下,迭代器会快速而干净地失败,而不是在未来某个不确定的时间冒着任意、非确定性行为的风险。而Hashtable的键和元素方法返回的枚举不会快速失败。HashTable和HashMap是Java集合框架的成员(自从Java 2平台v1.2以来,HashTable被改进以实现Map接口)。HashTable被认为是遗留代码,如果需要线程安全的高度并发实现,文档建议使用ConcurrentHashMap代替HashTable。HashMap不保证返回元素的顺序。对于HashTable,我想它是相同的,但我不完全确定,我找不到明确说明这一点的ressource。
已经发布了许多好答案。我补充了一些新的观点并总结了一下。
HashMap和Hashtable都用于以键和值的形式存储数据。它们都使用哈希技术来存储唯一的键。但是HashMap和Hashtable类之间有很多不同,如下所示。
哈希图
HashMap未同步。它不是线程安全的,如果没有适当的同步代码,就无法在多个线程之间共享。HashMap允许一个空键和多个空值。HashMap是JDK1.2中引入的一个新类。HashMap速度很快。我们可以通过调用以下代码使HashMap同步Map m=Collections.synchronizedMap(HashMap);Iterator遍历HashMap。HashMap中的迭代器快速失败。HashMap继承AbstractMap类。
哈希表
哈希表已同步。它是线程安全的,可以与多个线程共享。哈希表不允许空键或值。Hashtable是一个遗留类。哈希表很慢。哈希表是内部同步的,不能不同步。枚举器和迭代器遍历哈希表。Hashtable中的枚举器不会快速失败。Hashtable继承Dictionary类。
进一步阅读Java中HashMap和Hashtable之间的区别是什么?
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。
由于Java中的Hashtable是Dictionary类的一个子类,现在由于Map接口的存在而过时,所以不再使用它。此外,对于一个实现Map接口的类,没有什么是不能用Hashtable做的。