大家好,我是一名拥有两年半工作经验的Java开发工程师,平时喜欢摸鱼、划水、写代码和开会。接下来,我将分享我的求职心得和面试经验。

在这篇文章中,我将着重分享我的感受和一些实用建议,内容主要分为两个部分:

  • 面试经历:涉及白龙马云行科技、字节、淘宝、快手、百度、拼多多等多家公司的完整面试经历,包括我获得offer或者主动终止谈薪的情况。
  • 经验分享:涵盖心态调整、简历优化、算法准备和面试技巧。

图片

面试经历总结

以下是我在面试过程中所收集到的经验和问题,主要来自获得offer或主动终止谈薪阶段的公司。对于其他一些小公司或初创企业的面试问题,由于其不具备普遍性,未一一列举。

白龙马云行科技

一面

主要按照项目职责逐条提问,考察设计思路:

  1. 项目中的难点;
  2. 介绍xxl-job的实现原理;
  3. disruptor的使用场景;
  4. 生产者堆积时的解决方案;
  5. 服务异常时的恢复方法;
  6. MySQL的索引介绍;
  7. B+树的特性及其在MySQL中的应用;
  8. 线程池监控的实现方式;
  9. RPC服务超时处理方法;
  10. 异步多线程追踪的实现方式;
  11. Redis超时问题的排查思路与方法;
  12. 服务设计中的高可用性与易用性体现;
  13. 用户身份唯一性确认的方式;
  14. 对公司了解的程度;
  15. Integer a=200; Integer b=200,a与b的equals结果;
  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. 处理100M内存的数字文件排序。

瓴岳科技

一面

  1. 参与代码评审的经历;
  2. 令人印象深刻的好与坏的代码;
  3. ThreadLocal不remove的影响;
  4. Redis 7.0的新特性;
  5. Disruptor组件的介绍;
  6. Disruptor的底层实现及速度优势;
  7. Java锁的实现方式;
  8. AQS中线程并发时的同步队列情况;
  9. Netty中HTTP复用的实现;
  10. 项目中线程池的场景应用;
  11. 算法:寻找二叉树中指定节点的下一个中序遍历节点。

二面

  1. 生产者-消费者模式的引入原因;
  2. 项目中ES的使用场景;
  3. 新老服务迁移的过程;
  4. 单元测试的情况;
  5. 工作以来最大的收获;
  6. 分布式事务的介绍;
  7. 项目中如何保证分布式一致性;
  8. RocketMQ的概述;
  9. 算法:最小栈的实现;
  10. 算法:爬楼梯问题的动态规划实现。

三面

  1. 项目可优化的点与思考;
  2. 生产者-消费者模式中保证消息不丢失的策略;
  3. 微服务的概念;
  4. 消息队列的设计题。
  5. 算法:最长连续序列的实现。

字节

一面

  1. 服务的可用性监控;
  2. 服务故障保障的方法;
  3. MQ消费积压的处理方式;
  4. 线程池的工作机制;
  5. 核心线程可能被销毁吗;
  6. 核心线程数与最大线程数的区别;
  7. 阻塞队列的特性与底层实现;
  8. ThreadLocal的数据结构与工作原理;
  9. 弱引用的特性;
  10. ThreadLocal的key使用弱引用的原因;
  11. 事务的ACID特性;
  12. 事务隔离可能出现的问题;
  13. Redis的高可用性;
  14. Redis的主从与哨兵模式;
  15. 算法:判断一颗树是否为平衡二叉搜索树的实现。

二面

  1. 项目的具体模块设计;
  2. RPC中的TCP与HTTP协议区别;
  3. HTTP2.0的优化;
  4. 多路复用的介绍;
  5. MySQL分表的应用;
  6. 项目中缓存的应用;
  7. Redis的特性;
  8. Redis支持高并发的原理;
  9. Redis数据丢失的恢复方式;
  10. Redis持久化策略;
  11. 执行RDB操作时如何对外提供服务;
  12. Redis的淘汰策略;
  13. 算法:LRU缓存的实现。

三面

  1. 业务讨论;
  2. 系统架构的介绍;
  3. 市场上流行的规则引擎;
  4. 选择当前规则引擎的原因;
  5. 如何控制规则变更的风险;
  6. 项目可进一步优化的点;
  7. 算法:括号生成的问题。

淘宝

一面

  1. 解释==与equals的区别;
  2. 重写equals的方法场景;
  3. 深拷贝、浅拷贝与零拷贝的定义;
  4. Java动态代理的介绍;
  5. 序列化的方式与选型;
  6. Maven冲突的发现与解决;
  7. Linux查看大文件的命令;
  8. 大文件按行去重的实现;
  9. 算法:实现单例的多种方式;
  10. 算法:生成0到n-1中m个不同的随机数;
  11. 算法:字符串转long的实现。

二面

  1. ES的正排与倒排区别;
  2. ES优化查询速度的方法;
  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. 算法:约瑟夫环问题的实现。

三面

  1. 为什么考虑新的工作机会;
  2. 当前公司的工作经历;
  3. 最近项目的介绍;
  4. 项目中需要优化的点;
  5. 项目策略的效果评估;
  6. 工作期间成长较快的事情;
  7. 是否有搜索引擎的相关工作经验。

经验分享

心态

在求职过程中,保持良好的心态至关重要,尤其是在面试的准备阶段与实际过程中。我在去年三月份时接到字节的HR面试邀请,出于好奇我多投了一些公司,结果发现大部分只到二面便停止了,许多问题我都无法回答。此时我意识到自己的准备不足,虽然知道需要学习哪些知识,但面对浩大的内容和他人的成功经历,我感到不自信和失落。为了调整心态,我选择了短暂的旅行并制定了三个月的学习计划,同时阅读一些放松心态的书籍,比如《蛤蟆先生去看心理医生》,这让我恢复了内心的平静。

在求职过程中,我主要通过BOSS直聘投递简历,与中小公司的HR沟通时,常常听到“夏虫不可语冰”的话。特别在谈论薪资期望时,HR的反馈五花八门,有的觉得我的期望太高,有的则觉得市场行情不支持这样的薪资。然而,当我与大厂HR、猎头和主管沟通时,他们的态度则显得更加直接和正常。因此,在沟通中保持自信和冷静十分重要。

最后,如果面试没有通过,不要气馁,及时总结经验,继续投递下一家,一定能找到合适的工作。

简历

无论是校招还是社招,简历的重要性不言而喻。在我刚开始投递简历时,不少面试官表示未能看明白我所申请的岗位。为了改善这一点,我观看了许多简历指导课程,按照视频中的建议优化了自己的简历,最终HR主动要求查看我的简历,并没有出现简历筛选不过的情况。

算法

在面试中,算法题的重要性显而易见。在我的试水阶段,我坚持在LeetCode上刷题,累计刷了600多道题。刷题时,我并不盲目,而是选择了一种题型进行练习,从简单到中等难度,逐渐掌握相关技巧。此时我选择了向左程云的《程序员代码面试指南:IT名企算法与数据结构题目最优解》这本书学习。如果在学习过程中遇到问题,我会在知乎上向他请教,得到的回复细致且有帮助,这令我十分惊喜,因此我非常推荐左神的资源。若看书时感到困难,可以选择观看左神的视频,弹幕中常有类似“为何这样做”的问题,左神会分享他的思考过程,帮助理解算法。

技巧

  1. 练手与实践:通过面试小公司来磨练自己的面试技巧,尤其是表达能力与项目描述能力。
  2. 面试录音:在面试时录音,面试结束后复盘自己的回答,反思流程与重点,以及待改进的地方。面试如同戴着耳机唱歌,只有回放才能检验自己的表现。