开场白
HashMap应该是我们Java后端工程师面试面试频率非常高的一个点!
下面给大家列举出HashMap面试频率比较高的题,也是笔者经常考核候选人的题!
出现频率不高的题,我就不写了,别浪费读者的脑细胞,一次面试不会盯着HashMap问,也就三四个问题就结束了!
HashMap的内部数据结构(这里介绍JDK1.8的,面试中基本也是聊1.8)?
HashMap使用的是数组+链表+红黑树的一个数据结构组成的
你能讲讲HashMap中put方法的具体过程吗?
- 判断数组是否为空,为空进行初始化;
- 不为空,通过(n - 1) & hash计算数组中的位置;
- 查看 table[index] 是否存在数据,没有数据就创建一个节点;
- 存在数据,说明发生了hash冲突, 继续判断key是否相等,相等,用新的value替换原数据。
- 如果不相等,判断当前节点类型是不是树型节点,如果是树型节点,创造树型节点插入红黑树中;
- 如果不是树型节点,创建普通Node加入链表中;判断链表长度是否大于 8并且数组长度大于64, 大于的话链表转换为红黑树;
- 插入完成之后判断当前节点数是否大于阈值,如果大于开始扩容为原数组的二倍。
讲讲HashMap中get方法的过程?
- 计算key的hash值和key在数组中的位置
- 如果数组中的key是一致的就查询到了数据
- key不一致,就出现了hash冲突
- 判断是否是颗红黑树,如果是就从树中查询
- 否则就循环查找链表
你知道HashMap的数组初始化长度是多少吗?
初始值为0,当你put的时候会创建一个16个单位的数组
为什么HashMap的长度要是2的指数幂
方便进行位运算,提高速度
你知道负载因子为什么是0.75吗?
时间和空间的一个平衡点,值越大,说明空间越珍贵。
hash函数你了解吗?为什么这么设计
- hash函数是先拿到 key 的hashcode,然后让hashcode的高16位和低16位进行异或操作,
- 这样设计的原因可以减少hash冲突!
HashMap是线程安全的吗?
不是线程安全的,比如并发put数据是会出现覆盖数据的情况
怎样让HashMap线程安全
有多种方法,你记住使用ConcurrentHashMap就行了,其他的没这个好,也基本不会用到,就不介绍了(ConcurrentHashMap面试题后面持续更新)
关于HashMap的问题,出面面试基本够了。
其实还有很多技术含量的点,笔者不想再这展开了,面试不会问的那么详细,但是如果想提升自己的技术水平,上面对HashMap的了解还是远远不够的,笔者以后会在后面的文章给大家详细聊聊HashMap的设计原理,和源码讲解。