HashMap面试题我总结好了,面试够用了!

361 阅读3分钟

开场白

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的设计原理,和源码讲解。