zoukankan      html  css  js  c++  java
  • HashMap,HashTable,ConcurrentHashMap 比较

    这三个集合类是经常会用到及问到的,今天来总结一下区别及各自特点,;

    一、区别

    接下来从源码的角度来分析一下区别,用事实说话

    1.HashMap线程非安全,HashTable是线程安全的;

    HashTable的get源码,使用synchronized关键字,说明是线程安全的,HashMap没有;

    2.HashMap不允许空key/value,HashTable允许空key及空value,看看源码的put方法就能够恍然大悟了;

    HashTable的put方法,判断value是否为null,疑问,此处指判断value是否为null,那key能不能为null呢?测试一下,看代码哪个地方报错,下面标注的地方有去求key的hashcode,如果为null的话,肯定会有空指针异常的错误;

     HashMap就没有针对null进行判断

    3.默认容量大小及装载因子;

    HashTable默认为11,增加的方式是 old*2+1,但是装载因子都为0.75;

    HashMap的默认为16,而且容量必须为 2的指数倍

      

    二、怎么选择

    HashTable为线程安全的,方法加了synchronized,所以单线程的情况下,HashMap的性能要比HashTable的性能要好,多线程的情况下就考虑concurrentHashMap;

    原因:

    1.ConcurrentHashMap通过锁分段的方式来保证线程安全的,ConcurrentHashMap将hash表分成许多片段,每一段除了保存hash表外,本质上也是一个“可冲入的锁”。多线程对同一个片段的访问是互斥的,但是对于不同片段的访问却是可以同步进行;而HashTable多线程竞争时会锁住整个对象,这样会造成效率低下;

    2.ConcurrentHashMap的get方法是不加锁的,怎么实现的?见另一篇文章concurrentHashMap;  

    那么ConcurrentHashMap能完全替代HashTable吗?

    HashTable虽然性能上不如ConcurrentHashMap,但并不能完全被取代,两者的迭代器是一致性不同,hashTable的迭代器是强一致性的,而concurrentHashMap是弱一致性的;

     

    HashMap的原理

    查源码。。。

     

     

  • 相关阅读:
    ADSL自动更换IP的方法
    css框架 一个可控性强的css+xhtml页面布局生成器。
    Linux环境配置之LAMP搭建(源码安装)
    PHP小技巧
    Google首页电吉他源代码下载
    Jquery 插件可以用来操作定界窗,将在定界窗内选取的项目放到父窗口内
    今天見鬼了
    今天闲着没事去公园玩了一下,随手拍了几张
    PHP利用PHPMailer组件的Gmail发信能力发送电子邮件
    端午节放假去台湾中部山区野餐时照的
  • 原文地址:https://www.cnblogs.com/dpains/p/7133315.html
Copyright © 2011-2022 走看看