HashMap、Hashtable、LinkedHashMap、TreeMap、ConcurrentHashMap之间的区别-yellowcong

这些Map集合在面试中,经常会被问道和考到,所以总结一下,HashMap和Hashtable的区别在于1、多线程;2、主键是否为空;3、继承的父类

通过Collections.synchronizedMap()的方法,将Map集合变成线程安全的。

1 HashMap和Hashtable的区别

这个问题,可能和String与StringBuffer,StringBuilder一样经常被人问道,这个问题的标准答案,基本上是三点,

No HashMap HashTable
1 继承的是AbstractMap类 继承的的是Dicionary类
2 非线程安全 线程安全
3 允许存在null的key 不允许存在空key

1.1 继承的父类

HashMap继承的是AbstractMap类
这里写图片描述

Hashtable继承的的是Dicionary类
这里写图片描述

1.2 线程安全

HashMap是非线程安全的(效率比较的高)
Hashtable是线程安全的(效率相对比较低)

1.3 Key值是否可以存在null

HashMap可以允许为空
HashMap、Hashtable、LinkedHashMap、TreeMap、ConcurrentHashMap之间的区别-yellowcong_第1张图片

大家可以发现如果是空的key ,先判断一下HashMap的第一个Bucket,也就是第一个Entry(HashMap和Hashtable中,都维护的是一个Entry[] 链表数组)中是否存在,如果存在就修改值,如果不存在,就添加这个值(添加的位置是第一个 Bucket里面)。
HashMap、Hashtable、LinkedHashMap、TreeMap、ConcurrentHashMap之间的区别-yellowcong_第2张图片

Hashtable是不允许存在空的key
HashMap、Hashtable、LinkedHashMap、TreeMap、ConcurrentHashMap之间的区别-yellowcong_第3张图片

2、LinkedHashMap

基于链表的数据结构
LinkedHashMap继承了HashMap,实现了Map接口

这里写图片描述

3、TreeMap

基于Tree 数据结构的集合

4、ConcurrentHashMap

这个是无锁多线程编程所提供的一个集合组合,是基于cpu层面的CAS原子操作,用到这个操作,只需要在取队列元素和添加队列元素的时候利用CAS原子操作,就可以保证多个线程对队列元素的有序存取

你可能感兴趣的:(java)