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

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


当前回答

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

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。

其他回答

1.Hashmap和HashTable都存储键和值。

2.Hashmap可以将一个键存储为null。哈希表不能存储null。

3.HashMap未同步,但Hashtable已同步。

4.HashMap可以与Collection.SyncronizedMap(map)同步

Map hashmap = new HashMap();

Map map = Collections.SyncronizedMap(hashmap);

根据这里的信息,我建议使用HashMap。我认为最大的优点是,Java将防止您在迭代时修改它,除非您通过迭代器进行修改。

HashMap:使用哈希代码对数组进行索引的Map接口的实现。哈希表:嗨,1998年来电话。他们想拿回他们的集合API。

说真的,你最好完全远离Hashtable。对于单线程应用程序,您不需要额外的同步开销。对于高度并发的应用程序,偏执的同步可能会导致饥饿、死锁或不必要的垃圾收集暂停。正如Tim Howland所指出的,您可以使用ConcurrentHashMap。

除了这里已经提到的所有其他重要方面之外,CollectionsAPI(例如Map接口)一直在进行修改,以符合Java规范的“最新和最大”添加。

例如,比较Java 5 Map迭代:

for (Elem elem : map.keys()) {
  elem.doSth();
}

与旧的Hashtable方法相比:

for (Enumeration en = htable.keys(); en.hasMoreElements(); ) {
  Elem elem = (Elem) en.nextElement();
  elem.doSth();
}

在Java 1.8中,我们还承诺能够像使用好的旧脚本语言一样构造和访问HashMaps:

Map<String,Integer> map = { "orange" : 12, "apples" : 15 };
map["apples"];

更新:不,他们不会在1.8…:(

Project Coin的收藏增强功能是否将在JDK8中?

Hashtable是同步的,而HashMap不是。这使得Hashtable比Hashmap慢。

对于单线程应用程序,请使用HashMap,因为它们在功能方面是相同的。