【电话面试】HashMap面试聊了30分钟,狂问红黑树细节,深挖扩容机制细节,怪不得他能拿25k月薪!

作者: 小刘讲源码分类: 野生技能协会 发布时间: 2020-05-24 16:37:05 浏览:85640 次

【电话面试】HashMap面试聊了30分钟,狂问红黑树细节,深挖扩容机制细节,怪不得他能拿25k月薪!

小刘讲源码:
1.说说你对hash算法的理解 追问:hash算法任意长度的输入 转化为了 固定长度的输出,会不会有问题呢? 追问:hash冲突能避免么? 2.你认为好的hash算法,应该考虑点有哪些呢? 3.HashMap中存储数据的结构是什么样的呢? 4.创建HashMap时,不指定散列表数组长度,初始长度是多少呢? 追问:散列表是new HashMap() 时创建的么? 5.默认负载因子是多少呢,并且这个负载因子有什么作用? 6.链表转化为红黑树,需要达到什么条件呢? 7.Node对象内部的hash字段,这个hash值是key对象的hashcode()返回值么? 追问:这个hash值是怎么得到呢? 追问:hash字段为什么采用高低位异或? 8.HashMap put 写数据的具体流程,尽可能的详细点! 9.红黑树的写入操作,是怎么找到父节点的,找父节点流程? 10.TreeNode数据结构,简单说下。 11.红黑树的原则有哪些呢? 12.JDK8 hashmap为什么引入红黑树?解决什么问题? 追问:为什么hash冲突后性能变低了?【送分题】 13.hashmap 什么情况下会触发扩容呢? 追问:触发扩容后,会扩容多大呢?算法是什么? 追问:为什么采用位移运算,不是直接*2? 14.hashmap扩容后,老表的数据怎么迁移到扩容后的表的呢? 15.hashmap扩容后,迁移数据发现该slot是颗红黑树,怎么处理呢?

【回复】里面有八成我能回答上来
【回复】感谢up分享! 前阵子我研究了二叉树,因同学们要求,前几天研究了图的创建等原理。 感觉jdk底层实现,不少都是基于一定的数据结构,希望想深入学习的朋友可以多研究一下。 我是大衣哥,希望可以多多交流,一起进步,虽然我主要搞c,c++,c#,但对java还是有点了解。
尼禄托利亚:
其实我一直想,这么畸形的面试到底是为何?从05年至今一直在做java相关开发,什么sb之类的框架拿来随便用,但是真的要面试我类似于HashMap的深层次问题,我如果不做下功课,我还真的回答不出来。 虽然我回答不出来,但是这么多年工作,做过项目无数,这些所谓填鸭式的面试题又能证明什么?回答不出来就不胜任工作吗?写不出红黑树,就无法做开发吗? 这真是一个值得深思的问题。。。

【回复】现在it界就这样,程序猿太多了多,简单的大家都会,什么能拉开距离呢就是挖底层原理,不是每个人都能答上来,假如100个人中只有10个人能答上来说明人家用心了,人家准备得充分,答不上来不代表能力差只能说没准备充分。
【回复】没有办法,当下行业就是这么畸形。面试造火箭,进去拧螺丝...
【回复】回复 @翠微山人 :开车的有几个知道底层发动机原理的?发动机坏了都不会修,还叫司机?虽然开车也不过是踩下油门把握下方向盘,但4S店需要的是遇到发动机坏了能自己修的
放学别找我:
这种形式的面试是真的舒服,小刘老师问的问题有水平,更难得的是面试者回答的也有水平,这种视频看得太爽了[热词系列_这次一定][热词系列_三连]

【回复】一定就好 一定就好! 拍一期挺不容易的,拍视频的这个面试者工作挺忙的,能抽出来时间与我做视频,真的得谢谢这个同学了。 其实,最累的还是后期加字幕...加到怀疑人生!
【回复】回复 @小刘讲源码 :辛苦了[热词系列_妙啊]
小刘讲源码:
感谢大家的投币支持! 上一期ThreadLocal源码面试:BV19C4y1W72V 小刘讲师源码公开课列表: 1.手撕JDK8 HashMap源码课程:BV1LJ411W7dP 2.Java手写红黑树课程:BV1UJ411J7CU 3.并发编程基石CAS原理:BV1kE411u7bj 4.JDK8 新特性 手撕LongAdder源码:BV1KE411K7Ts 5.手撕线程池FutureTask源码:BV13E411N7pp 欢迎各位同学进群一起交流学习源码,QQ群:865-373-238 抬杠高手请绕行,时间宝贵,抬杠太累![doge][doge][doge]

【回复】BV1eV41167Sw SpringIOC容器源码电话面试,大家快来 冲冲冲!
【回复】BV1xV41127u6 ConcurrentHashMap源码电话面试,大家快来 冲冲冲!
小刘讲源码:
感谢大家的投币支持! 小刘讲师源码公开课列表: 1.手撕JDK8 HashMap源码课程:BV1LJ411W7dP 2.Java手写红黑树课程:BV1UJ411J7CU 3.并发编程基石CAS原理:BV1kE411u7bj 4.JDK8 新特性 手撕LongAdder源码:BV1KE411K7Ts 5.手撕线程池FutureTask源码:BV13E411N7pp 欢迎各位同学进群一起交流学习源码,QQ群:865-373-238 抬杠高手请绕行,时间宝贵,抬杠太累![doge][doge][doge]

【回复】手写红黑树? 支持up! 点赞! 这部分还是需要深厚的功底!
晚安怪兽:
可事实是面试头头是道的往往是平时不好好写业务,摸鱼看面试pdf。没什么实际解决问题能力的那批人。不排除少数厉害的。赞同评论区重项目的评论

【回复】面试题背的越6 offer拿的越多
永恒的暗黑迷:
这位同学对于put都能说的这么详细,恐怖如斯[囧]

【回复】其实核心就几步,画个流程图一目了然
【回复】看过教程基本感觉都可以
【回复】看过剖析视频这个可以做到[doge]
爱睡懒觉的小杨:
现在面试真的难,我面的后端,我跟他阐述辞职理由是上家公司技术栈太浅没法提升,简历上写的熟练的一点不问,spring javase那些问题一点都不问 就狂问消息队列,高并发,分布式10个6,7个答不上来,这我还是做了几天功课,关键我也没想要一万以上啊 就扣完税五险一金4 5千 还是小城市.完后又问我会不会Vue 问我js原型链.闭包es6各种新特性,我对js只会大体上使用.只会用个jquery.我说我面的后端啊.他说现在不都得会全栈么?不会哪能胜任工作.我是真的心累了.我要是要钱多狂问难点我理解 我就要个4 5K就这样.

【回复】面后端问Vue,这家公司基本可以跳过
【回复】回复 @怎么不想想呢 :直接跳过别影响心情
88413638:
还是不够硬核,你可以问问负载因子为啥0.75而不是其他,再问问为啥链表转红黑树一个条件是链表长8,而不是7或者9,为啥复原链表是6不是5或者7,再让详细聊聊jdk7下环状链表产生的具体细节[OK]

【回复】回复 @小刘讲源码 :如果你觉得这些问题没卵用的话,那么看源码同样也没卵用啊,如果我不懂resize你说影不影响我使用map?当然这些话属于抬杠,而我的真正观点是,看源码可以了解实现原理,可以更灵活的运用工具,如果你考虑了这些设计上的问题,你设计工具是不是也会去做类似的考虑,能说没用吗?还有至于环状链表那玩意确实没用,但是这东西我面试的时候还真确实碰到过,类似这种没用的知识点几个答不出来连拧螺丝的机会都没有,但是面试者多了解点东西去应付那些奇形怪状的面试官,也不算没用的事吧
【回复】哦...我觉得你提的这些问题 都是难为人的问题,而且没啥卵用,也考察不出来面试者的技术深度,只能看出来这个面试者是否看过面经。就说你最后提的这个 jdk7 环状表..这个问题吧,正常程序员不会在并发环境下使用 hashmap。再聊什么 死循环,没任何意义,因为hashmap内的字段都不是线程安全的,包括 记录 数量的 count。 连count都不是安全的,聊什么 扩容呢? 连达到扩容标准的 字段 都不准确...再聊那么多 不是浪费时间么?兄弟? 我给你提个小建议,多去关注技术实现细节,不要被一些魔性的面试题牵着鼻子走。 如果我想面map线程安全相关的,我可以去深度的去聊 jdk8 ConcurrentHashMap 实现的每一个细节,就说jdk8 ConcurrentHashMap的扩容吧,我觉得这块 我最低能面20分钟以上。 但是我绝对不会拿jdk8 hashmap去跟人聊线程安全。
【回复】回复 @甜筒爱吃小布丁 :牛顿二项分布,不是泊松,泊松是阈值8那个。stackoverflow上有牛人用牛顿二项式计算出来最佳加载因子是0.69,结合数组长度是2的幂次方,可取的接近0.69的数有0.5和0.75,为啥取0.75而不取0.5,个人理解是设计者在CPU资源和内存资源之间选择了内存,毕竟jvm内存不够容易发生gc。再说阈值8那个,概率那么小为啥还要转成红黑树,其实它这个概率是一次hash的概率,而假如要存储成千上万上十万百万的entry,此时链表大于8的概率就大大提升了,另外没有完美散列的hash算法,在极端情况下也会产生长链表。
孤の光:
鸟鸟:这问的我都精通,为什么人家月薪25k,我月薪2.5k?[吃瓜]

【回复】不科学呀,你肯定被人坑了,努力加班,年底你老板就换法拉利了[doge][doge]
【回复】回复 @小刘讲源码 :年底他老板就给他换老板娘了
【回复】回复 @小刘讲源码 :不是我,群里的鸟师傅(滑稽)[doge]
人造丧尸:
虽然还没毕业,但目前个人情况来说感觉问源码不像别人说的那么无用。很多人家写源码时用的方法结构,真的考虑到了很多东西,不断的优化到极致,还有设计模式的运用,多看看对自己提升很高的,我觉得能看透源码的人自己写的代码也绝对不会差,面试官抠源码是可以快速判断候选人水平的一种手段,没什么问题[OK]

【回复】大家都知道有用,但是知识太多了,大部分人的精力和记忆力有限
古道长亭边:
hash函数 :hash值为key的高16位和低16位(无符号右移)按位异或运算,计算出的hash出现0和1的分布比较均匀,不容易出现哈希冲突。 - 为什么是高低16位: - 数组空间无法满足,hashCode()函数计算出的int值过大。 - 数组长度一般都在低16位以内,保证高16位和低16位混合充分计算,加大低位的随机性、也保存了高位的部分 特征。这样参与寻址算法`hash&(table.length-1)`,不至于浪费了一个高位。 - 为什么是异或运算:异或运算能更好的保留各部分的特征 - 采用&运算计算出来的值会向0靠拢(同时为1,结果才为1,否则为0) - 采用|运算计算出来的值会向1靠拢(只要有一个1,其值为1) - 采用^运算结果为 1 和 0 的概率一致(两个值不同,为1,否则为0)

东文:
之前看过HashMap源码,做了些笔记,看了这个视频,结合着问题和回答,感觉更清晰了。不过红黑树没有过多去了解,后面再去好好看一下。 如果想了解源码,可以看看我的笔记,如果有错误欢迎指出[干杯] https://nyimac.gitee.io/2020/09/10/%E9%9B%86%E5%90%88%E6%BA%90%E7%A0%81/#HashMap

永恒的暗黑迷:
刚刚听到map扩容两倍的原来是采用位易运算而不是✖️2,学到了,硬币奉上[OK]

【回复】看一下jdk的源码,就知道是位运算了
【回复】回复 @红覆盆子雪媚娘 :位运算效率高
【回复】回复 @非主流凤舞九天 :*2太low了
坏森生:
拿这些看学历的,AQS、重入锁、并发工具源码、Spring 源码、Spring Cloud技术栈、消息中间件、ZK、Kafka、REDIS底层数据结构、算法、JVM等,这些都答上来才能拿25k;

【回复】说句实话吧,我工作8年多了,面过n多人,经验告诉我 一般学历的应聘者 很少将技术能掌握到源码层面,反而重本 学历 高学历的应聘者技术水平相当扎实。所以,你在说这些结论之前,你得能证明自己精通,你说的这些东西,不然的话,你这个结论推敲不过去。
【回复】我这些都不懂,现在25。。。
【回复】回复 @南晨晨晨_ :哈哈,跳大厂了,这一年真是一言难尽。
痛心凉心飞扬:
这就类似中医和现代医学的区别。中医是经验积累,参照以往的经验绝大部分的病都能治好。但是现代医学更多的是研究病理和药理,得出一套理论。你什么框架都能拿来用,那也只是会用,框架使用的原理知道吗?如果以后公司遇到了一个以前都没遇到过的问题,你能去研究和解决吗?特别是像阿里这种站在技术前沿的公司,对员工要求肯定是要理解原理,并且在碰到问题能够自己创造工具去解决。而不是等着别的谁弄出一个sb框架然后拿来用。

【回复】大厂问无可厚非,小作坊也学这套了,钱给的没人多,其实少数人做科学家就行了,大多数人只是养家糊口,行业内卷到大家做了很多无谓浪费精力的事情,影响了很多人对幸福生活的向往

程序员 职场 JAVA 高薪 找工作 面试 it offer HashMap bilibili新星计划

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!