这三个集合类是经常会用到及问到的,今天来总结一下区别及各自特点,;
一、区别
接下来从源码的角度来分析一下区别,用事实说话
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的原理
查源码。。。