Map类集合差异性比较

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/so_geili/article/details/79720763

Map集合在面试中,必考必问。

Map集合类 Key Value super 说明
Hashtable 不允许为null 不允许为null Dictionary 线程安全
ConcurrentHashMap 不允许为null 不允许为null AbstractMap 锁分段技术(JDK8:CAS)
TreeMap 不允许为null 允许为null AbstractMap 线程不安全
HashMap 允许为null 允许为null AbstractMap 线程不安全

一、HashMap的工作原理

HashMap的底层是用hash数组和单向链表实现的 ,当调用put方法是,首先计算key的hashcode,定位到合适的数组索引,然后再在该索引上的单向链表进行循环遍历用equals比较key是否存在,如果返回true,则新的value值覆盖原来的值;如果返回false,则插入单向链表的头部。

HashMap的两个重要属性是容量capacity和加载因子loadfactor,默认值分布为16和0.75,当容器中的元素个数大于 capacity*loadfactor时,容器会进行扩容resize 为2n,在初始化Hashmap时可以对着两个值进行修改,负载因子0.75被证明为是性能比较好的取值,通常不会修改,那么只有初始容量capacity会导致频繁的扩容行为,这是非常耗费资源的操作,所以,如果事先能估算出容器所要存储的元素数量,最好在初始化时修改默认容量capacity,以防止频繁的resize操作影响性能。

HashMap在容量不够进行resize时,由于高并发可能会出现死链,导致CPU占用飙升,在开发过程中可以使用高并发包里的ConcurrentHashMap,或者加锁的方式规避此风险。

二、HashMap和Hashtable有什么区别

1、HashMap是非线程安全的,HashTable是线程安全的。
2、HashMap的键和值都允许有null值存在,而HashTable则不行。不允许存null的地方存储null值时会抛出NPE异常。
3、因为线程安全的问题,HashMap效率比HashTable的要高。
4、Hashtable是同步的,而HashMap不是。因此,HashMap更适合于单线程环境,而Hashtable适合于多线程环境。
5、HashMap提供了可供迭代的键的集合,因此,HashMap是快速失败的。另一方面,Hashtable提供了对键的枚举(Enumeration),是安全失败的。

注意:一般现在不建议用HashTable, ①是HashTable是遗留类,内部实现很多没优化和冗余。②即使在多线程环境下,现在也有同步的ConcurrentHashMap替代,没有必要因为是多线程而用HashTable。

猜你喜欢

转载自blog.csdn.net/so_geili/article/details/79720763