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的原理

    查源码。。。

     

     

  • 相关阅读:
    时间插件--daterangepicker使用和配置详解
    AdminLTE 前端框架
    vue element-ui 绑定@keyup事件无效
    Plugin/Preset files are not allowed to export objects,webpack报错/babel报错的解决方法
    webpack学习
    指令
    【Nuxt】配置路由
    【面试】常见面试题
    安装虚拟机
    【linux】基础知识
  • 原文地址:https://www.cnblogs.com/dpains/p/7133315.html
Copyright © 2011-2022 走看看