分享一位球友在今年二月份投稿的面经(社招),写的非常详细,内容很不错。他在当前这种招聘环境下依然拿了很多大厂的 offer,确实很厉害了!
下文中的我代表这位投稿的球友。
大家好,我是工作时长两年半的 Java 开发工程师,喜欢摸鱼、划水、code、开会,接下来我将介绍下我的社招求职心得和面经。
方法论和知识点我就不多介绍了,更多是想说一些我的感受和建议,分为以下两个方面:
- 面经 :白龙马云行科技、字节、淘宝、快手、百度、拼多多等上十家拿到 offer 或者谈薪阶段主动终止的公司的完整面经。
- 经验分享 :心态、简历、算法、技巧。
面经总结
面经部分都是拿到 offer 或者谈薪阶段主动终止的公司,其他小公司或创业公司都是为了练手,面试题没有普遍性的都没有列举出来,面试问题写的少的都是问项目、业务比较多的。算法题只在 leetcode 上找原题,没有贴出链接的就是 leetcode 上没有的。
白龙马云行科技
一面
主要按照项目职责描述一条一条问,考察设计思路:
1、项目中的难点;
2、介绍下 xxl-job 的实现原理;
3、disruptor 的使用场景;
4、生产者出现堆积的话怎么解决;
5、生产消费过程中如果服务出现异常,如何恢复;
6、介绍下 MySQL 的索引;
7、B+树的特征,为什么 MySQL 要使用 B+树;
8、如何做到监控线程池;
9、RPC 服务超时的情况如何止损;
10、如何实现异步多线程追踪;
11、Redis 超时问题,排查过程中考虑的角度,使用了哪些方法;
12、服务设计时怎么体现高可用性、易用性;
13、用户身份唯一性确认;
14、对我们公司有了解吗;
15、Integer a=200;Integer b=200,a 和 b equals 是否为 true;
16、介绍下缓存雪崩、击穿、穿透,如何避免;
17、工作中是否遇到过 CPU 过高、内存过高的情况,怎么排查问题原因的;
18、单链表和双链表的优缺点;
19、判断单链表是否有环,算法的时间复杂度;
20、ArrayList、HashMap、TreeSet 哪些属于有序的,哪些是稳定的;
21、线程池的工作原理;
22、线程池中关于时间的参数起什么作用;
23、项目中有没有用过并行流;
24、ForkJoin 线程池默认线程数;
25、新生代和老年代的特点,分别使用哪些算法;
26、软引用和弱引用的回收时机。
二面
1、离职原因;
2、现在公司的技术氛围;
3、下一份工作的偏好;
4、未来发展规划;
5、数组和链表遍历哪个更快(考虑存储);
6、Integer 为什么要有-128~127 的常量;
7、Java 已有可达性分析和 GC,为什么还要设定软引用、弱引用;
8、ThreadLocal 为什么使用弱引用;
9、Redis 清理过期数据的策略;
10、一个 G 数字文件,100M 内存,排序。
瓴岳科技
一面
1、怎样参与 CR;
2、印象深的好的代码、不好的代码;
3、ThreadLocal 不 remove 会有什么问题;
4、Redis 7.0 的新特性;
5、介绍下 Disruptor,有哪些组件使用到了;
6、Disruptor 底层实现,为什么快;
7、Java 的锁是怎么实现的;
8、AQS 中线程并发时同步队列的放入情况;
9、Netty 如何使用 http 复用;
10、项目中线程池的用法、场景;
11、算法:找到二叉树指定节点中序遍历的下一个节点(类似剑指 Offer II 053. 二叉搜索树中的中序后继[1])。
二面
1、为什么要引入生产者-消费者模式;
2、项目中 ES 的使用场景;
3、项目新老服务迁移的过程;
4、单元测试的情况;
5、工作以来最大的收获;
6、介绍下分布式事务;
7、项目中怎么保证分布式一致性;
8、介绍下 RocketMQ;
9、算法:155. 最小栈[2];
10、算法:爬楼梯,每次可走 3 步和 5 步(类似70. 爬楼梯[3],要求动态规划实现,五阶递推数列)。
三面
1、项目中可优化的点,对项目的思考;
2、生产者-消费者模式怎么保证消息不丢失;
3、微服务的概念;
4、设计题:设计一个消息队列;
5、算法:128. 最长连续序列[4]。
字节
一面
1、服务的可用性监控;
2、服务故障的保障性;
3、MQ 出现消费积压,如何处理;
4、线程池工作的机制;
5、核心线程可能会被销毁吗;
6、核心线程数和最大线程数的区别;
7、阻塞队列的特性,底层实现;
8、ThreadLocal 数据结构和工作原理;
9、弱引用的特性;
10、为什么 ThreadLocal 的 key 使用弱引用;
11、事务 ACID 的特性;
12、事务隔离可能出现的问题;
13、介绍下 Redis 的高可用;
14、Redis 的主从、哨兵模式;
15、算法:判断一个树是平衡二叉搜索树(110. 平衡二叉树[5]、98. 验证二叉搜索树[6] 两道题的合并)。
二面
1、项目的具体模块设计;
2、RPC 中 tcp 协议和 http 协议的区别;
3、http 2.0 的优化;
4、介绍下多路复用;
5、MySQL 分表;
6、项目中用到缓存的场景;
7、Redis 的特性;
8、Redis 支持高并发的原理;
9、Redis 数据丢失后如何恢复;
10、Redis 的持久化策略;
11、执行 RDB 操作时如何对外提供服务;
12、Redis 淘汰策略;
13、算法:146. LRU 缓存[7]。
三面
问题:
1、业务讨论;
2、系统的架构;
3、市面上流行的规则引擎有哪些;
4、为什么选择现在的规则引擎;
5、怎么控制规则变更过程中的风险;
6、项目可进一步优化的点;
7、算法:22. 括号生成[8]。
淘宝
一面
1、==和 equals;
2、重写 equals 的场景;
3、深拷贝、浅拷贝、零拷贝;
4、介绍下 Java 中的动态代理;
5、序列化,有哪些方式,选型;
6、maven 冲突,怎么发现,如何解决;
7、Linux 大文件查看,du -sh;
8、大文件按行去重。
9、算法:2 种以上实现单例的方式;
10、算法:0~n-1 选 m 个不同的随机数;
11、算法:字符串转 long(类似8. 字符串转换整数 (atoi)[9])。
二面
1、ES 正排和倒排的区别;
2、ES 如何优化 query 查询速度;
3、ES 什么时候增加、减少节点;
4、ES 如何引入排序算法;
5、系统如何限制 TP999 时间;
6、hashmap 在多线程下可能出现的情况;
7、hash 冲突的意思;
8、cookie 和 session 的区别;
9、如果已经禁用了 cookie,还能使用 session 吗;
10、如何实现单点登录;
11、安全性的保证;
12、同步、异步、阻塞、非阻塞;
13、线上 Java 服务有问题如何排查;
14、git merge 和 rebase 的区别;
15、一个没有源码的应用,如何替换数据库地址;
16、算法:剑指 Offer 62. 圆圈中最后剩下的数字[10](约瑟夫环)。
三面
1、为什么看新的工作机会;
2、在现在公司工作经历;
3、介绍下最近的项目;
4、项目中需要优化的点;
5、项目中策略的效果评估;
6、工作期间觉得成长比较快的事情;
7、做过哪些搜索引擎相关的工作。
菜鸟
一面
1、介绍几种 NIO 模式;
2、Redis 中使用的 NIO,与其他 NIO 对比的优势;
3、缓存击穿、穿透、雪崩,解决方法;
4、Redis 能否存储 null;
5、MySQL 的性能瓶颈;
6、介绍下分库、分表,常见操作。
7、编程题:小猫抢鱼,三个线程表示三只猫,抢一堆鱼,每次抢一半的鱼,直到为 0。
二面
面了两个小时,问了很多很多技术问题,挖的比较深入:
1、大量业务相关问题(考察知识边界);
2、项目中的难点;
3、介绍下 kylin;
4、disruptor 不同等待策略;
5、为什么选择 disruptor;
6、介绍下 disruptor 的底层实现;
7、disruptor 的无锁体现在哪里;
8、disruptor 游标的技巧;
9、disruptor 如何解决 JDK 当时无法处理的伪共享;
10、CompletableFuture 和 Future 的区别;
11、CompletableFuture 提供的创新设计模式—promise 模式;
12、关注的 CPU 使用率指标具体是哪个;
13、object 的 equals 和 hashCode 方法,能不能只改 equals;
14、hashmap 的数据结构,扩容时机;
15、concurrentHashMap 和 hashmap 的区别,为什么前者的 key 和 value 都不能为 null;
16、concurrentHashMap 怎么保证的线程安全;
17、怎么启动一个线程,怎么让线程停下来;
18、怎么让变量线程安全;
19、volatile 怎么做到可见性;
20、CPU 的真实存储结构;
21、平时的学习途径;
22、对哪方面研究的比较深;
23、了解哪些设计模式;
24、使用 arthas 的场景;
25、arthas 排查线程占比过高的实现原理;
26、编程题:实现一个方法,判断两个数组是否相等,元素类型为泛型。
快手
一面
1、ConcurrentHashMap 如何实现线程安全,如何保证安全扩容;
2、synchronized 锁升级的过程;
3、Java 中有哪些乐观锁;
4、读写锁和 synchronized 有哪些区别;
5、synchronized 为什么可以做到异常自动释放锁;
6、介绍下 ReentrantLock;
7、AQS 同步队列中的线程什么情况下知道可以激活;
8、Redis String 类型底层数据结构;
9、Redis 持久化方式;区别、优缺点;根据业务判断下选择哪种方式比较好;
10、OOM 的排查;
11、JDK 版本与 GC;
12、G1 的优势;
13、算法:2. 两数相加[11]。
二面
1、项目中 kylin 的使用场景;
2、项目中 CompletableFuture 的使用场景;
3、生产并发过高的问题,如何解决的;
4、Spring 中的 BeanFactory 和 FactoryBean 的区别;
5、线程池的核心参数,任务执行过程中的变化;
6、MySQL 索引的底层数据结构;
7、介绍 disruptor 框架的特点;介绍下使用场景;
8、Spring AOP 的实现原理;
9、动态代理和静态代理的区别;
10、介绍下 RPC 中调用方请求服务方接口中间的过程;
11、服务方轮询的地方,如何确定具体提供服务的 IP;
12、多个 PRC 服务如何保证一致性;
13、设计题:班级、学生、课程,设计 MySQL 表;
14、设计题:实现快手关注中心功能,发布者发布的内容能被看到,观看者能看到所有关注的人发布的内容且形成信息流列表;
15、平时的学习渠道和方法,举一些例子;
16、换工作的原因,对下一份工作的期望。
三面
1、规则引擎的选型与实现;
2、Redis 分片和复制的机制;
3、排查 Java 服务 CPU 占用率百分之百;
4、GC 识别垃圾对象的方法;
5、常用的 GC;
百度
一面
问题:
1、如何保证分布式数据一致性;
2、MQ 消息发送失败、消费失败如何恢复;
3、Redis 集群模式下数据在不同机器上的影响;
4、Redis 的 NIO 模型;
5、百度上亿的广告物料,考虑到检索效率、更新,如何设计比较好;
6、介绍下 JMM 模型,作用,场景;
7、synchronized 升级的内容,锁升级过程;
8、介绍下 RocketMQ;
9、如何解决重复写、重复读、消息丢失的问题;
10、算法:445. 两数相加 II[12]。
二面
除了项目,全部都是数据库相关的问题:
1、分页查询大量数据,如何设计(避免出现页码过深,耗时很长的问题);
2、limit 为什么会出现页码越大,耗时越长的问题;
3、>、<条件会用到索引吗,处理过程;
4、那些条件会用到索引;
5、between and 会走索引吗?什么情况下不走索引;
6、between and 和 limit 的区别;
7、设计一个适用消费者模式的消费表,对外提供消费接口,分布式并行消费,保证不漏消费、不重复消费;
8、如何通过 MySQL 保证行的原子性;
9、Redis 如何解决原子性;
10、MySQL 如何做到 where 条件匹配多条但只更新一条(用 update limit);
11、MySQL 表同时收到多条更新操作,如何处理;
12、update 时,行级锁是在什么时间点加上的。
三面
三面技术文的较少,闲聊偏多:
1、最近在看哪方面的知识;
2、介绍下对 Java 并发编程的理解;
3、单线程一定会比多线程慢吗?分别适用于什么场景;
4、实际工作中使用多线程的场景;
5、业务模式讨论;
6、觉得自己项目中做的比较出彩的点;
7、介绍下熟悉的设计模式;
8、下一份工作的目标。
拼多多
一面
1、描述下对 Spring IOC 的理解,与传统 new 的方式相比优势有哪些;
2、SpringBoot 如何实现每次 Autowired 都创建新的实例;
3、Mybatis 的 Transactional 注解实现事务的原理;
4、动态代理原理实现的注解有哪些注意事项;
5、MySQL 的几种 log 的作用;
6、聚簇索引和二级索引的区别;
7、varchar 和 text 类型的字段存储形式有什么区别;
8、text 类型的字段可以创建索引吗;
9、介绍下 Redis 管道通信;
10、算法:150. 逆波兰表达式求值[13];
11、算法:计算四个数字数组和为 0 的组数,O(n²)时间复杂度。
二面
1、ES 的优化方式;
2、Redis 的哨兵机制;
3、分库分表;
4、MySQL 的事务隔离级别;
5、介绍下 InnoDB 的 mvcc;
6、算法:剑指 Offer 29. 顺时针打印矩阵[14]。
三面
主要是一些闲聊,问到了加班问题:
1、为什么不考虑读研;
2、校招时为什么要选择现在的公司;
3、在每个阶段的工作人员组成情况;
4、目前的状态,为什么想出来看机会;
5、对于工作地点是怎样的考虑。
6、对于拼多多的工作时间接受吗;
搜狐媒体
一面
1、git merge 原理;
2、jvm GC,垃圾回收器,为什么不用 G1;
3、SpringBoot 启动 装载 starter 过程;
4、concurrentHashMap 扩容过程;
5、slfj 选择 log 的机制;
6、clone()方法,为什么没人用;
7、hashcode,生成方式;
8、算法:判断整数奇偶;
9、算法:合并 map,求平均值,带嵌套;
10、算法:链表相加,实现 this.add(ListNode b)。
二面
1、几乎全部为业务、项目相关问题;
2、任务中断如何处理;
3、项目中用到的设计模式,解决的问题;
4、未来的规划;
5、对下一份工作的期望。
三面
现场面试:
1、项目流程,架构画图;
2、项目可优化的点;
3、项目效果;
4、算法:判断一个数是否能被每一位上的数整除(美丽数);
5、算法:56. 合并区间[15]。
小红书
一面
1、介绍下项目;
2、介绍下 hashmap 的原理;
3、为什么引入红黑树;
4、如果不用树,引入其他数据结构解决链表过长查询效率低;
5、CompletableFuture 的使用场景;
6、线程池的执行流程;
7、为什么线程池执行的机制设计成这样;
8、并发包下的工具类;
9、RPC 服务,A B C D 四个调用,A B C 之间没有依赖关系,D 需要等到 A B C 执行完之后再执行,有哪些实现方式;
10、MySQL 中(a,b,c)建立了联合索引,几种可以命中索引的场景;
11、如何减少回表;
12、select * 为什么会导致回表;
13、服务中使用的 GC;
14、meta space 中存储的数据;
15、服务启动后,mate space 的空间不断增加的原因;
16、查看 mate space 的存储情况;
17、SpringBoot 动态代理的实现方式;默认使用方式的变化;
18、动态代理方式的性能区别;
19、Redis 查询突然变慢的原因;
20、项目中出现 Redis 连接超时的原因;
21、消息队列,rocketMQ 的实现原理;
22、disruptor 的使用,实现原理;
23、设计题:直播间大红包分发,10 亿红包,10 万观众,每个红包额度 1-100 元;
14、算法:剑指 Offer II 069. 山峰数组的顶部[16]。
二面
1、大量业务、项目问题,根据简历上的职责描述一条一条的问;
2、项目中解决问题;
3、介绍下 MySQL 分库分表,垂直、水平、服务端、客户端分表;
4、实现的方式有哪些;
5、ES 如何实现深度分页;
6、在团队中的角色;
7、离职的原因,未来的规划;
8、有了解竞品产品吗,了解到什么程度;
9、过往绩效情况。
三面
基本都是项目相关的问题 :
1、项目中规则引擎的实现;
2、本地缓存存在的问题;
3、介绍下 disruptor;
4、学习途径,看过哪些书;
5、对下一份工作的期待。
滴滴
一面
1、针对项目不断延展,给的压力很大;
2、列举项目中的三个难点;
3、SQL 中为什么 in 比 between and 慢;
4、工作中觉得做的不足的地方;
5、如何提升业务理解能力;
6、设计题:设计广告索引引擎,几百万的广告数据,如何做到几十毫秒左右检索、返回广告;
7、离职的原因;
8、对下一份工作的预期;
9、算法:53. 最大子数组和[17];
10、算法:字符串相减(415. 字符串相加[18] 入参相同)。
二面
倾向于方法论相关的问题:
1、工作期间的成长;
2、服务可用性的监控有哪些,监控体系是怎么考虑的;
3、负责的服务在整个工程中的角色,重要性如何体现;
4、针对服务出问题的情况,值班机制是什么样的;
5、系统哪部分查的问题最多,解决方案是什么;
6、出现问题多的原因是什么;
7、未来的职业规划;
8、沟通能力的体现;
9、算法:54. 螺旋矩阵[19]。
经验分享
心态
求职过程中最重要的就是心态,包括准备阶段和面试过程。我在去年三月份的时候被字节 hr 热情约面,于是想着多投几家试试水,结果发现最多到二面就结束了,很多问题都不会。现在想想很正常,因为当时很多面试题和面试指南都没有看完,但是当时觉得很郁闷,总有自己太菜的想法冒出来。知道要学哪些知识,但是知识太多了,加上看到别人的面经,投的公司一样,人家都拿到 offer 了,就觉得差距太大了,导致心态总是很崩溃。当时的化解方法是先去旅游放松了一下,然后制订了近三个月的学习计划,中间穿插着看放松心态的书,看书加上实际的学习,让心态真的平静下来。
然后是求职过程中的心态,我都是使用 BOSS 直聘投递简历的,和中小公司 hr 沟通的过程中,想到最多的一句话就是“夏虫不可语冰”,主要体现在问期望薪资,他们要么说太高了、要么说现在的行情不可能给到这么高,还有说我现在薪资就挺高的,建议多待一段时间 。后面遇到大厂的 hr、猎头、主管,都是直言期望薪资正常,所以在和 hr 沟通的过程中也要稳住心态,坚信自己的想法。
最后是面试过程中,中小厂的一些面试官喜欢让你简短介绍项目,等你介绍完了,又不断的暗示或明说你的项目简单,这个时候也不要觉得自己项目真的很差,因为只是一些复杂的细节你没有介绍出来,或者面试官故意制造的压力测试,再或者就是面试官的素质、水平原因,因为我确实没有遇到大厂面试官说过这种话。
最关键的如果面试没有通过,千万不要气馁,总结下面试经验,接着投下一家就好了,只要坚持找,一定能找到工作。
简历
不管校招还是社招,简历都是很重要的敲门砖,像我在试水阶段就被面试官说过看我的简历不知道我是什么岗位。后面我看了很多简历指导课,跟着视频优化简历,根据反馈再修改。最后,都是 hr 主动要简历,并且没有简历筛选不过的。
技巧
一是拿小公司练手,太久没有面试,表达能力和描述项目可以通过真实面试过程来精进,这时就可以拿中小公司或者没有意愿的公司来面试练手。
二是面试录音,所有面试全程录音,下来复盘问题,听听自己的回答是否流程、重点有没有说出,以及不会的问题再学习寻找答案。我觉得面试就像是戴着耳机唱歌,只有唱完听录音才自己唱的怎么样。
·············· END ··············
欢迎准备 Java 面试以及学习 Java 的同学可以私信我回复【888】即可免费领取,干货很多!虽然是免费,但星球里的内容或许比你参加上万的培训班质量还要高。
如果本文对你有帮助的话,欢迎 点赞&在看&分享 ,这对我继续分享&创作优质文章非常重要。非常感谢!