“金9银10“面大厂,90%会被问到的HashMap问题!(含答案)

前言

正值金9银10的黄金招聘期,大家都准备好了吗?HashMap 是面试官必问的一个知识点,其内部的基本实现原理是每一位面试者都应该掌握的,只有真正地掌握了 HashMap 的内部实现原理,面对面试官的拷问,才不会手忙脚乱。
近段时间正值找工做的最佳时间,本人将一些各大厂商的面试题和今年(2020)最新资料的收集,如下是部分资料截图(全部资料均已整合成文档,pdf压缩打包处理)。
若有有须要的朋友能够点击这里来获取资料,暗号:qf

在这里插入图片描述web

面试题

1,HashMap底层存储结构面试

HashMap在Jdk1.7的时候采用的是数组加链表的数据结构,jdk1.8以后采用了数组加链表加红黑树的数据结构。观察源码可知HashMap类中有一个很是重要的字段就是Node[] table,即哈希桶数组。而Node是HashMap的一个内部类,实现了Map.Entry接口,自己就是一个键值对。算法

2,解决Hash冲突的方法,HashMap采用了什么方法解决Hash冲突?数组

HashMap使用哈希表来存储数据的,固然哈希表不可避免的就会遇到hash冲突问题,解决hash冲突的方法大体有两种:安全

1.开放地址法:当地址发生冲突时,按着某种方法继续探测哈希表中的其余存储单元,直到找到空位置为止。数据结构

2.链地址法:链地址法就是数组加链表的结合,在每个数组元素上都有一个链表结构,当地址发生冲突时就讲数据存放在链表中。svg

而HashMap就是采用链地址法进行解决hash冲突的。性能

3,jdk1.8的HashMap中的链表达到多少个时会生成红黑树?大数据

HashMap用链地址法解决hash冲突,则当链表里的长度太长就会严重影响HashMap的性能。因而在jdk1.8里,对数据结构作了进一步优化,引入了红黑树,当链表长度大于8的时候,链表就会转成红黑树,利用红黑树快速增删改查的特色提升HashMap的性能,其中会用到红黑树的插入、删除、查找等算法。
在这里插入图片描述
4,HashMap初始值的大小和负载因子的大小?优化

hashMap初始长度就是16,负载因子是0.75。HashMap所容纳的最大数据量为:长度*负载因子。即当长度达到这个值的时候就会发生扩容。

5,HashMap扩容机制

扩容(resize)就是从新计算容量,向HashMap对象里不停的添加元素,而HashMap对象内部的数组没法装载更多的元素时,对象就须要扩大数组的长度,以便能装入更多的元素。固然Java里的数组是没法自动扩容的,方法是使用一个新的数组代替已有的容量小的数组,就像咱们用一个小桶装水,若是想装更多的水,就得换大水桶。底层是resize方法中的transfer方法将原有的Entry数组的元素拷贝到新的Entry数组里,扩容都是以2的N次幂进行扩容 通常是2倍。

6,HashMap线程安全问题 HashTable ConcurrentHashMap

HashMap是线程不安全的,多个线程同时写HashMap可能会致使数据的不一致。若是须要知足线程安全能够用ConcurrentHashMap,还有一个HashTable。可是HashTable是继承自Dictionary类,HashTable容器使用synchronized来保证线程安全,但在线程竞争激烈的状况下,HashTable的效率很是低下,ConcurrentHashMap是由Segment数组结构和HashEntry数组结构组成,采用segment分段锁来保证线程安全。

HashTable不管key或value都不能为null,HashMap只能容许一个key为null,能够运行多个value为null。并且HashTable是线程安全的,HashMap是线程不安全的。

7,HashMap链表成环

因为HashMap线程不安全的,至于为什么不安全,何时会出现问题,这里来讨论一下:

当有多个线程共同操做hashMap的put方法时,这个时候hashMap容量不够了,两个线程都去扩容执行resize方法,在这个时候cpu切换资源的话,会形成链表成环问题,死循环问题。

题外

到此这篇关于HashMap面试题汇总(附答案)的文章就介绍到这了
若有有须要的朋友能够点击这里来获取资料,暗号:qf**
在这里插入图片描述