一个HashMap跟面试官扯了半个小时

前言

HashMap应该算是Java后端工程师面试的必问题,因为其中的知识点太多,很适合用来考察面试者的Java基础。

开场

面试官: 你先自我介绍一下吧!

安琪拉: 我是安琪拉,草丛三婊之一,最强中单(钟馗不服)!哦,不对,串场了,我是**,目前在–公司做–系统开发。

面试官: 看你简历上写熟悉Java集合,HashMap用过的吧?

安琪拉: 用过的。(还是熟悉的味道)

面试官: 那你跟我讲讲HashMap的内部数据结构?

安琪拉: 目前我用的是JDK1.8版本的,内部使用数组 + 链表红黑树;

安琪拉: 方便我给您画个数据结构图吧:

面试官: 那你清楚HashMap的数据插入原理吗?

安琪拉: 呃[做沉思状]。我觉得还是应该画个图比较清楚,如下:

  1. 判断数组是否为空,为空进行初始化;
  2. 不为空,计算 k 的 hash 值,通过(n - 1) & hash计算应当存放在数组中的下标 index;
  3. 查看 table[index] 是否存在数据,没有数据就构造一个Node节点存放在 table[index] 中;
  4. 存在数据,说明发生了hash冲突(存在二个节点key的hash值一样), 继续判断key是否相等,相等,用新的value替换原数据(onlyIfAbsent为false);
  5. 如果不相等,判断当前节点类型是不是树型节点,如果是树型节点,创造树型节点插入红黑树中;(如果当前节点是树型节点证明当前已经是红黑树了)
  6. 如果不是树型节点,创建普通Node加入链表中;判断链表长度是否大于 8并且数组长度大于64, 大于的话链表转换为红黑树;
  7. 插入完成之后判断当前节点数是否大于阈值,如果大于开始扩容为原数组的二倍。

面试官: 陷入沉默,讲的这么清楚,难道是也关注了微信公众号【安琪拉的博客】,我继续按照套路问,刚才你提到HashMap的初始化,那HashMap怎么设定初始容量大小的吗?

安琪拉: [这也算问题??] 一般如果new HashMap() 不传值,默认大小是16,负载因子是0.75, 如果自己传入初始大小k,初始化大小为 大于k的 2的整数次方,例如如果传10,大小为16。(补充说明:实现代码如下)

static final int tableSizeFor(int cap) {int n = cap - 1;n |= n >>> 1;n |= n >>> 2;n |= n >>> 4;n |= n >>> 8;n |= n >>> 16;return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
}

补充说明:下图是详细过程,算法就是让初始二进制右移1,2,4,8,16位,分别与自己位或,把高位第一个为1的数通过不断右移,把高位为1的后面全变为1,最后再进行+1操作,111111 + 1 = 1000000 = 2626 2 6 2626 2^6 26262626 (符合大于50并且是2的整数次幂 )

面试官: 你提到hash函数,你知道HashMap的哈希函数怎么设计的吗?

安琪拉: [问的还挺细] hash函数是先拿到 key 的hashcode,是一个32位的int值,然后让hashcode的高16位和低16位进行异或操作。

面试官: 那你知道为什么这么设计吗?

安琪拉: [这也要问],这个也叫扰动函数,这么设计有二点原因:

  1. 一定要尽可能降低hash碰撞,越分散越好;
  2. 算法一定要尽可能高效,因为这是高频操作, 因此采用位运算;

面试官: 为什么采用hashcode的高16位和低16位异或能降低hash碰撞?hash函数能不能直接用key的hashcode?

[这问题有点刁钻], 安琪拉差点原地

HashMap面试底层原理(原作者很厉害)相关推荐

  1. 为什么要学习HashMap的底层原理?

    本文转载自公众号  码农翻身 上周发了一篇文章<漫画:什么是HashMap?>,引起了不少人的讨论,有一个人的留言引发了我的思考:"作为一个程序员, 真的有必要学习这些底层原理吗 ...

  2. 为什么使用HashMap需要重写hashcode和equals方法_最通俗易懂搞定HashMap的底层原理...

    HashMap的底层原理面试必考题. 为什么面试官如此青睐这道题? HashMap里面涉及了很多的知识点,可以比较全面考察面试者的基本功,想要拿到一个好offer,这是一个迈不过的坎,接下来我用最通俗 ...

  3. HashMap 的底层原理

    HashMap 的底层原理 1. HashMap的数据结构 数据结构中有数组和链表来实现对数据的存储,但这两者基本上是两个极端. 数组 数组存储区间是连续的,占用内存严重,故空间复杂的很大.但数组的二 ...

  4. hashMap和hashTable的区别以及HashMap的底层原理?

    hashMap和hashTable的区别? 1.继承的父类不同 HashTable继承Dictionary类,而hashMap继承了AbstractMap类,但是二者都实现了map接口. 2.线程安全 ...

  5. HashMap的底层原理你真的知道?

    HashMap的底层实现原理是面试中出现频率非常高的一道面试题,本文将对HashMap的底层实现原理做一个简要的概况和总结,便于复习. 一.对于Map集合存储结构的理解 首先介绍以HashMap为典型 ...

  6. HashMap的底层原理 cr:csdn:zhangshixi

    1.    HashMap概述: HashMap是基于哈希表的Map接口的非同步实现.此实现提供所有可选的映射操作,并允许使用null值和null键.此类不保证映射的顺序,特别是它不保证该顺序恒久不变 ...

  7. HashMap的底层原理

    一:HashMap的节点:HashMap是一个集合,键值对的集合,源码中每个节点用Node<K,V>表示 static class Node<K,V> implements M ...

  8. HashMap是什么?HashMap的底层原理是什么?

    HashMap?这到底是是个什么东东? 要想了解HashMap,首先我们回到数据结构了解一下 "散列表" 散列表,也被称为哈希表,这种数据结构主要提供了键(Key)值(Value) ...

  9. 深入浅出~HashMap的底层原理透析

    创作宗旨:化繁为简,绝不冗余,点到为止 直接开门见山,就事论事! 什么是 HashMap? HashMap类继承了父类AbstractMap<K,V>,实现了接口Map<K,V> ...

最新文章

  1. linux下目录的个个文件夹含义
  2. 细数二十世纪最伟大的十大算法
  3. 2021-10-27 PTA 数据结构 链表 两个有序链表序列的合并
  4. MySQL CHAR、VARCHAR、TEXT、ENUM、SET(字符串类型)
  5. SPOJ - LCS Longest Common Substring(后缀自动机)
  6. 草稿 断开式连接 1204
  7. 假如BERT系论文变成Commit History
  8. ●洛谷P2606 [ZJOI2010]排列计数
  9. redis 学习笔记(六) sorted_set数据类型
  10. 实现离线地图行政区域划分
  11. js导入xlsx文件
  12. 《三国演义》里到底描写了多少个人物,你知道吗?
  13. Android 调用 系统选择器 选择 图片 或 文件(ACTION_PICK、ACTION_GET_CONTENT)
  14. Incorrect string value: ‘\xF0\x9F\x91\x82‘ for column ‘address‘ at row 1
  15. linux samba yum,CentOS7下yum安装SAMBA全命令过程
  16. html5手机 一键开发,Html5变革下的H5和手机app开发工具
  17. find missing conjunction, why?
  18. 如何设计游戏中道具功能(一)
  19. 计算机科学与技术毕业论文格式,计算机科学与技术毕业论文格式示例.docx
  20. 201771010137赵栋《第九周学习总结》

热门文章

  1. 金融财经知识——逆回购
  2. 为什么我们说NFT拥有无限潜力?
  3. IP、域名、端口有什么关系
  4. 启动关闭oracle命令,oracle启动关闭命令
  5. python中exec函数_python exec函数怎么用?
  6. 左边是地狱右边也是地狱_地狱甚至还能做些什么(除了拿走我们的钱)
  7. 利用命令激活未激活的Windows10专业版系统的技巧 2018/9/9亲测有效
  8. 北交大计院软件工程复试经验
  9. 工作之路 - 中国平安江苏分公司客户服务部
  10. js字符串拼接变量名及赋值