面试分享背景

这篇文章分享了一位读者在字节跳动的Java后端实习面试经验,并成功获得了Offer。虽然字节跳动以Go语言为主,但依然有大量Java岗位可供选择。

图片

字节跳动招聘官网

我整理了他在面试中遇到的问题,并提供了详细的参考答案,希望能帮助到正在准备面试的朋友们。此外,强烈建议面试者多观看相关面试经验,并根据自己的简历进行自我测试,这对于提高面试成功率非常重要。

个人背景

我是一所末流211高校的软件工程专业2023届毕业生,最初并没有太多期待,但最终意外地通过了面试。

第一面试(60分钟)

  1. 自我介绍。
  2. 项目讨论:登录鉴权的实现方式?为何选择JWT?其优势是什么?如何防止Token被篡改?
  3. 项目讨论:缓存的使用情况?技术选型的考虑因素?为什么使用Sorted Set来实现排行榜?Redis的数据同步和迁移是如何进行的?
  4. 项目讨论:如何防止表单的重复提交?
  5. Spring相关:如何理解AOP?在项目中的应用是什么?Spring AOP和AspectJ AOP的区别?
  6. 线程池相关:如何理解线程池的参数和拒绝策略?你的项目中是如何使用线程池的?如果你设计一个线程池,你会如何实现?
  7. Java并发(这部分问题较为深入,让我应接不暇):进程与线程的区别,你了解协程吗?JMM的理解及其作用。如何理解happens-before原则及其作用。Java中有哪些锁?synchronized关键字的理解、原理以及锁升级过程。对AQS的了解,以及其原理。ReentrantLock的源码解析。ThreadLocal的理解、原理及内存泄漏问题。
  8. Java并发的延续:手写DCL(Double Check Lock)线程安全方法。为什么需要使用volatile?volatile的作用和底层原理。
  9. 计算机网络:HTTPS与HTTP的区别,HTTPS的加密过程。
  10. Leetcode 199:二叉树的右视图。

第二面试(50分钟)

  1. 自我介绍。
  2. 计算机网络:HTTPS与HTTP的区别,SSL/TLS的工作原理,你了解中间人攻击吗?
  3. 计算机网络(此部分较深入,有些问题未能回答,建议加强基础):TCP与UDP的区别,TCP的三次握手和四次挥手,TIME-WAITCLOSE-WAIT的作用?为什么要三次握手,而不能两次?连接大量处于TIME-WAIT状态的原因是什么?TCP是长连接还是短连接?
  4. 计算机网络:从输入URL到浏览器显示页面的完整流程。
  5. 数据库:对MySQL索引的理解及其底层数据结构。如何判断SQL语句是否使用了索引?
  6. 数据库:如何理解事务?表级锁与行级锁的理解,幻读、脏读问题的解决办法。
  7. JVM:GC是如何判断回收的垃圾对象?GC算法有哪些?Minor GC与Full GC的不同之处?你了解ZGC垃圾回收器吗?
  8. JVM:双亲委派模型的理解,是否在项目中实践过自定义类加载器。
  9. 场景问题:处理几十GB的数据都是URL,内存只有1GB而磁盘空间无限,如何统计频率最高的Top 10?
  10. Leetcode 32:最长有效括号[11]、Leetcode 110:平衡二叉树[12]。

第三面试

在这一轮中,技术问题明显减少,更多的是与面试官进行技术思维的交流。

  1. 自我介绍。
  2. 你觉得自己在一二面中的表现如何?
  3. 除了Java,你还学习过其他编程语言吗?我提到C语言,面试官要求我讲述Java与C的使用体验和应用场景。
  4. 你了解爬虫吗?大学期间是否写过爬虫?如何构建一个爬虫代理服务?
  5. 分布式缓存设计及其问题解决思路(雪崩和穿透)。
  6. 讲述自己做过的印象最深的项目以及从中学到的知识。
  7. Leetcode 44:二叉树每层找最大值。

参考答案(根据面试问题的顺序整理,部分微信外链无法直接访问,建议文末查看原文):

  • 如何构建一个爬虫代理服务?[19]
  • 解析分布式系统的缓存设计[20]

人力资源面试

这一轮面试主要是轻松的交流。

  1. 自我介绍。
  2. 项目中担任的角色,做了什么,最有成就感的事。
  3. 对公司的了解情况?面试了哪些公司?选择实习的原因。
  4. 你平时是如何学习的?
  5. 你有什么问题想问我?
  6. 除了技术,你还有什么兴趣爱好?

总结

字节跳动的面试难度相对较大,但面试效率高,整体体验也相当不错。面试官给我的印象很好,显然是一群专注技术的人,没有太多空洞的言辞。