这些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可以允许为空
大家可以发现如果是空的key ,先判断一下HashMap的第一个Bucket,也就是第一个Entry<K,V>
(HashMap和Hashtable中,都维护的是一个Entry<K,V>[]
链表数组)中是否存在,如果存在就修改值,如果不存在,就添加这个值(添加的位置是第一个 Bucket里面)。
Hashtable是不允许存在空的key
2、LinkedHashMap
基于链表的数据结构
LinkedHashMap继承了HashMap,实现了Map接口
3、TreeMap
基于Tree 数据结构的集合
4、ConcurrentHashMap
这个是无锁多线程编程所提供的一个集合组合,是基于cpu层面的CAS原子操作,用到这个操作,只需要在取队列元素和添加队列元素的时候利用CAS原子操作,就可以保证多个线程对队列元素的有序存取