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

    查源码。。。

     

     

  • 相关阅读:
    u-boot下延时程序失效的bug调试
    tiny4412u-boot烧写及根文件系统制作(不进入终端问题)
    tiny4412学习笔记-将uboot、zImage、文件系统烧到emmc中 (转)
    Tiny4412 U-BOOT移植(转)
    为何ARM linux会引入Device Tree(转)
    嵌入式开发社区
    基于tiny4412的u-boot移植(二)(转)
    ARM Linux 3.x的设备树(Device Tree)(转)
    HTML基础-------HTML标签(1)
    HTML基础-------最初概念以及相关语法
  • 原文地址:https://www.cnblogs.com/dpains/p/7133315.html
Copyright © 2020-2023  润新知