Java集合面试题(03) Java中HashMap和HashTable之间区别

声明:本文为本博主翻译,未经允许,严禁转载!

简介

虽然Hashtable和HashMap都是基于散列表的数据结构,并且都实现了Map接口,但它们的主要区别在于HashMap不是线程安全的,而Hashtable是线程安全的。这意味着你不能在没有同步的情况下在多线程Java应用程序中使用HashMap。另一个区别是HashMap允许一个空键和空值,但是Hashtable不允许空键或值。而且,HashTable的线程安全性是使用内部同步实现的,这使得它比HashMap慢。顺便提一下,Java中的HashMap和Hashtable之间的区别是核心Java面试中常见的问题之一,以检查候选人是否理解集合类的正确使用,并了解可用的替代解决方案。
除了Java中的HashMap内部如何工作的?ArrayList vs Vector,这是Java中Collection框架中最经常被问及的问题之一。 Hashtable是一个遗留的Collection类,它在Java API中已经有很长一段时间了,但它在Ja​​va 4中被重构以实现Map接口,并且从那里Hashtable成为Java Collection框架的一部分。
Java中的Hashtable vs HashMap是如此受欢迎的一个问题,它可以列在Java Collection面试题的任何列表中。在进行任何Java编程面试之前,你不能不准备HashMap vs Hashtable。在这篇Java文章中,我们不仅会看到HashMap和Hashtable之间的一些重要差异,而且还会看到这两个集合类之间的一些相似之处。
我们先看看它们有多不同。

Java中HashMap和Hashtable的区别

HashMap和Hashtable都实现了Map接口,但它们之间有一些重要的区别,在决定是使用Java的HashMap还是Hashtable之前,需要记住一些重要的区别。其中一些是线程安全,同步和高速的。以下是这些差异:
1.HashMap类大致等同于Hashtable,不同之处在于它是非同步的并且允许空值。 (HashMap允许空值作为键和值,而Hashtable不允许空值)。
2. HashMap和Hashtable的主要区别之一是HashMap是非同步的,而Hashtable是同步的,这意味着Hashtable是线程安全的,可以在多个线程之间共享,但HashMap不能在没有正确同步的情况下在多个线程之间共享。 Java 5引入了ConcurrentHashMap,它是Hashtable的一个替代方案,并提供比Java中的Hashtable更好的可伸缩性。

Java集合面试题(03) Java中HashMap和HashTable之间区别

3. HashMap和Hashtable的另一个显着区别是,HashMap中的迭代器是一个快速迭代器,而Hashtable的枚举器不是,并且如果任何其他线程通过添加或删除元素,而非通过Iterator自身的remove()修改映射,则抛出ConcurrentModificationException。但是,这不是一个有保证的行为,并将尽最大努力由JVM完成。这也是Java中的Enumeration和Iterator之间的一个重要区别。
4. Hashtable和HashMap之间的一个更显着的区别是,由于线程安全和同步,如果在单线程环境中使用Hashtable比HashMap慢得多。所以,如果你不需要同步,HashMap只能被一个线程使用,那么它比Java中的Hashtable要好。

5. HashMap不能保证Map的顺序会随着时间的推移保持不变。

如果你正在准备这个问题作为你的Java面试准备的一部分,我建议准备在Programming Interviews Exposed给出的每个重要的话题。它涵盖了基础知识,核心Java,线程,像Spring和Hibernate这样的框架以及许多其他关键主题。

HashMap和Hashtable:关于一些重要术语的注释

1)同步意味着只有一个线程可以在一个时间点修改一个哈希表。基本上,这意味着在对Hashtable执行更新之前,任何线程都必须获取对象上的锁,而其他人将等待锁释放。

2)故障安全(fail-safe)与迭代器的上下文有关。如果在集合对象上创建了Iterator或ListIterator,并且某个其他线程尝试修改集合对象的“结构”,则将引发并发修改异常。其他线程可能调用“set”方法,因为它不会“结构性”地修改集合。但是,如果在调用“set”之前,集合已经在结构上进行了修改,则会抛出“IllegalArgumentException”异常。
3)结构性修改是指删除或插入可以有效改变映射结构的元素。HashMap可以被同步

Map m = Collections.synchronizeMap(hashMap);

总之,Java中的Hashtable和HashMap之间有很大的不同。考虑到线程的安全性和速度,只能选择使用Hashtable,如果你绝对需要线程安全,并且运行Java 5及以上版本,可以考虑在Java中使用ConcurrentHashMap。

原文链接

What is difference between HashMap and Hashtable in Java?