2022携程暑期实习后端开发一面面经
2022年3月17日15点20-16点10
一.自我介绍
二.聊简历,项目
三.提问(按照技术栈一块一块问的,具体细节有点记不清了)
1.SpringBoot JPA
2.Mybatis
3.Spring AOP
4.redis(基本数据类型,缓存异常,怎么解决,持久化)
5.Java并发(线程池,CAS,原子类,synchronized,volatile)
6.准备用HashMap存1w条数据,构造时传10000会触发扩容吗?
这题印象深刻,我第一次遇到hashmap这样问的,一开始没回答在点子上
后来突然想到负载因子,面试官让我继续说下去,方向是对的,但实现细节不清楚,最后只说了个不会扩容的结论
总结下原因:
在 HashMap 中,提供了一个指定初始容量的构造方法 HashMap(int initialCapacity),这个方法最终会调用到 HashMap 另一个构造方法,其中的参数 loadFactor 就是默认值 0.75f。
从构造方法的逻辑可以看出,HashMap 并不是直接使用外部传递进来的 initialCapacity,而是经过了 tableSizeFor() 方法的处理,再赋值到 threshole 上。
在 tableSizeFor() 方法中,通过逐步位运算,就可以让返回值,保持在 2 的 N 次幂。以方便在扩容的时候,快速计算数据在扩容后的新表中的位置。
那么当我们从外部传递进来 1w 时,实际上经过 tableSizeFor() 方法处理之后,就会变成 2 的 14 次幂 16384,再算上负载因子 0.75f,实际在不触发扩容的前提下,可存储的数据容量是 12288(16384 * 0.75f)。
这种场景下,用来存放 1w 条数据,绰绰有余了,并不会触发扩容。
参考文献:https://blog.csdn.net/plokmju88/article/details/102965957
这种场景下,用来存放 1w 条数据,绰绰有余了,并不会触发扩容。
参考文献:https://blog.csdn.net/plokmju88/article/details/102965957
四.反问
结束
上海得物信息集团有限公司公司福利 1263人发布
