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

查源码。。。

 

 

原文地址:https://www.cnblogs.com/dpains/p/7133315.html