HashMap和HashTable的分析(ConurrentHashMap的衍生)

集合类是Java API的核心。同时HashMap和HashTable的比较是面试中常见的问题,是考验程序员能否正确使用集合类。HashMap是 Map接口的常用实现类,HashSet是Set接口的常用实现类;HashTable是个过时的集合类,存在于Java API很久,但在Java 4中被重写,实现了Map接口,所以自此之后也成了java集合框架的一部分。

HashMap和HashTable的区别

HashMap和HashTable都实现了Map接口,但决定用哪一个得了解他们区别有哪些。主要区别有:线程安全性、同步(synchronization)以及速度。
(1)HashMap几乎是等价于HashTable,除了HashMap是非synchronization的,并可以是null(即HashMap可以接受为null的键(key)和值(vaule),而HashTable不行)。
(2)HashMap是非synchronization,而HashTable是synchronization,这就意味着HashTable是线程安全的,多个线程共享一个HashTable;而如果没有正确同步的话,多个线程是不能共享HashMap的。Java5提供了ConcurrentHashMap,它是HashTable的替代,比hashTable的扩展性更好。
(3)HashMap的迭代器(iterrator)是fail-fast迭代器;而HashTable的enumeration迭代器不是fail-fast的。所以当有其他线程改变的HashMap的结构(增加或删除元素),将会抛出ConcurrentModificationException异常,但这并不是一定会发生的行为,要看JVM。这条同样是Enumeration和Iteration的区别。
(4)由于HashTable是线程安全的也是synchronization,所以在单线程的情况下它比HashMap要慢。如果你不需要同步,只要一个线程,那么使用HashMap的性能要好过HashTable。
(5)HashMap不能保证随着时间的推移Map中的元素次序不变。

上述总结

Fail-safe和Iteration迭代相关。如果某个集合对象创建了Iterator或者ListIterator,然后其它的线程试图“结构上”更改集合对象,将会抛出ConcurrentModificationException异常。但其它线程可以通过set()方法更改集合对象是允许的,因为这样并没有从结构上进行更改。但是如果已经从“结构上”进行了修改,在调用set()方法,将会抛出IllegalArgumentException异常。
“结构上”更改指的是删除或插入元素,这样会影响Map结构。
HashMap也可以实现同步:

Map = = Collections.synchronizeMap(hashMap);

为什么需要使用ConcurrentHashMap和CopyOnWriteArrayList

同步的集合类(HashTable和Vector),同步封装类(使用Collectios.synchronizedMap()和Collections.synchronizedList()方法返回的对象)可以创建出线程安全的Map和List。但是有些原因使他们不适合高并发系统。它仅仅仅有单个锁,对整个集合加锁,以及为了防止ConcurrentModificationException异常,经常要在迭代的时候讲集合锁定一段时间,这些特性对扩展性来说都是障碍。
ConcurrentHashMap和CopyOnWriteArrayList保留了线程安全的同时,也提供了高并发性。它们并不要处处使用。大部分时候只要用到HashMap和ArrayList。

HashTable和ConcurrentHashTable区别

它们可以运用到多线程的环境中,但是当HashTable大小增加到一定的时候,性能会急剧下降,因为迭代时需要锁定很长时间。因为ConcurrentHashMap引入了分割,不论它多大,仅仅需要锁定map的某个部分,而其他线程不需要等待迭代完成才能完成map。简而言之,ConcurrentHashMap仅仅锁定map的某个部分,而Hashtable锁定整个map。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值