HashMap和Hashtable的区别

HashMap和Hashtable的比较是Java面试中的常见问题,主要用来考研程序员是否可以正确使用集合类以及是否能够随机应变使用多种思路解决问题。程序员

前不久面试时正好也被问到了这个问题,今天忽然想起来了,索性就整理一下,写个总结。面试

 

HashMap和Hashtable都实现了Map 接口,可是具体要使用哪个,须要先了解它们存在怎样的区别,而后再根据具体的状况作出选择。安全

 

一、线程安全性性能

  首先,HashMap是非synchronized的,而Hashtable是synchronized的。这说明Hashtable是线程安全的,并且多个线程能够共享一个Hashtable;spa

而HashMap若是没有正确的同步的话,是不能被多个线程所共享的。可是,Java 5中为咱们提供了ConcurrentHashMap,它是Hashtable的替线程

代,并且比Hashtable的扩展性更好。code

  其次,HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的迭代器(enumerator)却不是fail-fast的。所以,当有其它线程改变了对象

HashMap的结构(删除或插入新的元素一个),将会抛出ConcurrentModificationException异常,可是迭代器自己的remove()方法移除元素或者其blog

它线程经过set()方法更改集合对象是容许的(可是,若是已经从结构上进行了修改,在调用set()方法,将会抛出IllegalArgumentException异常),接口

由于这并无更改集合的“结构”。然而,这并非一个必定会发生的行为,要看JVM。固然这个行为也是Enumeration和Iterator的区别。

 

二、同步和速度

  因为Hashtable是线程安全的,也是synchronized的,因此在单线程环境下比HashMap要慢。若是你不须要同步且只须要单一线程的话,那么使用

HashMap性能要比Hashtable好一些。此时,HashMap是个不错的选择。

 

三、容纳数据

  HashMap几乎能够等价于Hashtable,除了HashMap是非synchronized的,并能够接受null值(HashMap能够存在null的键值(key)和值(value),

可是Hashtable是不能够的)。

 

四、次序

  HashMap不能保证随着时间的推移Map中的元素次序是不变的。要保持元素顺序不变,除非是LinkedHashMap。

 

注:如何实现HashMap的同步呢?

1 HashMap hashMap = new HashMap();
2 Map map = Collections.synchronizeMap(hashMap);

 

总结

一、HashMap和Hashtable的主要区别在于:线程安全和速度。

二、尽可能只在你须要彻底的线程安全的时候选择使用Hashtable。

三、若是你使用的是Java 5+的话,尽可能使用ConcurrentHashMap。

相关文章
相关标签/搜索