浅析JAVA面试中常见问题之Map(一)
JAVA面试常见问题,用于学习,借鉴和答疑,同时希望您能留下宝贵的意见和建议,共同进步
项目里常见使用的Map存储结果为HashMap,LinkedHashMap,CurrentHashMap,TreeMap等,每种Map存储结构,都有其应用的场景,通过了简单了解其内部结构,以及优缺点,以便能更好的在不同场景下使用。
一、Map类继承和实现接口关系图:
二、Map实现类简单介绍与使用场景
Map是Key,Value键值对的存储结构
- TreeMap:实现SortedMap接口,根据键排序,默认是按键值的升序排序。在项目里主要应用是排序展示,例如销量排名,自动派单员工信息等。
- HashMap:根据键的hashCode值存储数据, HashMap允许空键空值,但只允许一个空键,允许多条空值。HashMap非线程安全,可以有多个线程同时操作HashMap,会出现数据不一致的情况。初始容量为16,负载因子为0.75,大于12是自动扩容。
- LinkedHashMap:继承于HashMap,与HashMap不同点在于保存了数据的插入顺序,当数据再次获取展示时,插入数据顺序未发生变化。HashMap则每次展示数据的顺序具有随机性。LinkedHashMap
在项目里应用于导表字段存放,可以保证表头一致性。 - ConcurrentHashMap:实现ConcurrentMap接口,线程安全,内部Segment继承ReentrantLock类,通过加锁释放锁来使线程安全。在项目里主要应用是数据多线程数据计算后存放。初始容量为16、负载因子为0.75和并发级别为16
- Hashtable:Hashtable是遗留类,与HashMap类似,继承于Dictionary类,线程安全,并发性不如ConcurrentHashMap,因为ConcurrentHashMap引入了分段锁。Hashtable不建议在代码中使用。
三、简单分析不同JDK版本数据存放结构
在JDK1.7时,HashMap的数据存放主要是链表形式,JDK1.8,HashMap的数据存放在8个数据时,依旧是链表,超过8个时,先判断数组长度是否小于64,如果小于64,则进行扩容,数组长度大于等于64时,则链表转变为红黑树。主要是数据查询时间复杂度取决于链表的长度,为 O(n)。为了降低这部分的开销,在 Java8 中,引用了红黑树存储结构,在这些位置进行查找的时候可以降低时间复杂度为 O(logN)。