给大家分享一个读者的面试经历。
我看了一下我们的聊天记录,他 2020 年的时候就加了我,讨论过几次技术相关的问题。然后他也慢慢开始写文章,我看了他的文章隐隐感觉到是个工作多年的大佬。
没想到是大佬不假,但是他居然才毕业不到三年时间。
他是二本毕业,工作年限是 2 年半,以下是他的面试分享。
面试准备
复习
你信我,真学习还得看书,看书能让你的知识体系更加健全。
当然,平时也可以看一些大佬的文章扩充一下知识库。
我看过的 Java 相关的书单如下:
- Java:《Java 并发编程的艺术》、《Java 并发编程实战》
- JVM:《深入理解 Java 虚拟机》第三版、《深入 Java 虚拟机:JVM G1GC 的算法与实现》、《新一代垃圾回收器 ZGC 设计与实现》、美团技术团队相关 JVM 的文章、R 大相关 JVM 文章
- MySQL:《MySQL 技术内幕:InnoDB 存储引擎》、《高性能 MySQL》、《MySQL 实战 45 讲》、《从根儿上理解 MySQL》、《从零开始带你成为 MySQL 实战优化高手》
- Redis:《Redis 设计与实现》、《Redis 开发与运维》、水滴与银弹Redis 系列文章
- Kafka:半兽人博客、《Apache Kafka 实战》
- Zookeeper:《从 Paxos 到 Zookeeper:分布式一致性原理与实践》
- 架构:《凤凰架构》、《领域驱动设计:软件核心复杂性应对之道》
还有一个点是,看书的时候可以尝试记一下笔记,这样效率会高一些,不至于看完就忘记了。
小编也准备了一些Java面试资料,以助于大家复习,需要的小伙伴查看文末
算法
算法的话,没有那么多高超的技巧,LeetCode 前 200 道反复刷就行了,应付社招绰绰有余。
我只刷了 170 道题,面了十几个大公司,大多的算法题都是原题。
刚开始刷的时候会很痛苦,坚持几天,没有思路的就看答案,看完答案继续写代码,写不出代码继续看答案,反反复复坚持下来算法就搞定了。
简历
简历的话,从大学毕业到现在,我一直用的是超级简历,我感觉挺好用的:
https://www.wondercv.com/
至于怎么写简历,我也不是专家,不说些花里花哨的,直接给一个我的简历模板吧,仅供参考。
提一个点,你写的简历就是划了一个知识范围,然后让面试官从题库里面选题,如果你自己划的知识点你都不清楚,那你面试肯定没有把握的。
所以,一定要对你简历上面的每一字负责,要对你在简历上写的每一个技术点都熟悉。
面试过程
自我介绍
自我介绍是简历的精简,不需要说一些没意义的事情,面试官也不关注你喜不喜欢打篮球,爱不爱唱歌,你只需要把你做过的最牛逼的事情,解决过的最复杂的问题讲出来就行了。
举个例子:
面试官你好,我叫 CoderW,19 年毕业于哈佛大学。
从毕业到现在一直从事后台研发相关工作。
19 年-22 年在谷歌中间件团队,主要负责 xx 中间件的设计与开发,在这期间,完成了对 xxx 进行改造和优化,整体性能提升了 80%;
22 年去了微软电商团队,负责微软电商体系的设计,两年的时间,完成了微软电商从 0 到 1 的搭建过程。上线至今,日活量达到了 10 亿,系统平均 QPS 达到 1W。
这一次应聘的是贵公司中间件团队的资深专家岗位,在业务方向和技术栈方面,我个人认为我的匹配度还是比较高的,非常希望能够加入贵公司,一起打造 xx 系统。谢谢!
技术讨论
自我介绍完之后,一般就是技术讨论环节,这个环节一般 30 到 50 分钟,是整个面试最重要的一个环节。
1. 不卑不亢
记住,这个环节是技术讨论环节,不是问答环节。一场好的技术讨论一定是有来有回,而不是单方面的你问我答。
在尊重面试官的前提上,可以对面试官的一些结论提出质疑和探讨,在我看来,敢于提出自己的不同看法是一个加分项。
如果遇到不尊重你,甚至侮辱你的面试官,我建议你直接把简历要回来,大家都是打工人,有什么好装的?
2. 真诚以待
有些面试官喜欢问一些比较冷门的知识来验证候选人的技术深度,这是一个很正常的事情,你也不需要太过于紧张,真诚一点,会就是会,不会就是不会,没什么关系。
千万不要自作聪明强行去编造,真诚永远是第一要义!
3. 深入发散
如果聊到你熟悉的一个知识点,你一定要好好把握,可以尝试着深入和发散,让面试官慢慢的进入你的节奏。
举个例子,聊到 Kafka 零拷贝的时候。
- 深入:你可以继续深入,聊一下 sendfile+DMA Scatter/Gather。
- 发散:深入后再发散,聊一下为什么 RocketMQ 写日志用到了零拷贝,但是 Kafka 写日志的时候不用零拷贝。
深入是展现你对技术的了解程度,发散是展示你的视野宽度。
回答完一个问题之后,可以小小的总结一下,这样不至于你一个人在那里讲的云里雾里,让面试官都找不到你想要表达的重点了。
编程环节
如果你的工作年限不是太长,技术讨论环节过后一般会有一个编程环节(这个环节也有可能会放到技术讨论之前)。
编程题分为两种,一种是算法题,一种是语言技巧题。
算法题可能大家都能理解,像什么“两个线程交叉打印 A 和 B”、“手写单例模式”、“手写一个简单工厂设计模式”就属于语言技巧题。
算法题上面提过了,狂刷就行;语言技巧题也就那几个,背一下就好。
反问环节
个人认为,反问环节没啥用,根本就不能改变整个面试结果。
所以我一般就固定两个问题:
- 我面试的这个岗位需要用到哪些技术栈?
- 我面试的这个岗位的最大挑战是什么
面经
面经奉上,不是很全,希望有帮忙。
顺丰
1.HashMap,扩容过程,怎么解决哈希冲突?
2.聊了一篇之前写过的 MySQL 的一篇博客,讲讲 MySQL 慢 SQL 优化思路?解决流程,应该从哪些方面考虑?
3.APM,怎么监控,原理是什么?Java Agent 了解过吗?
4.G1,最大的特点,标记位图,卡表卡页,SATB。
5.介绍 TiDB,什么是分布式数据库?和 MySQL 比优缺点是什么?
6.怎么做数据冷热分离?怎么做分库分表?为什么要用 ES?
7.分布式事务几种实现方式,讲讲本地消息表、尽最大努力通知、TCC。你们选用的是什么?AT 有什么问题?
8.报表 DSL 优化,享元模式优化过程,优化效果怎么样?
9.单机和微服务的区别,微服务有什么问题?数据一致性问题怎么解决?幂等问题怎么解决?
10.现在负责的系统分为几个模块?如何划分?怎么治理?
11.MQ 使用场景有哪些?在项目中具体哪些地方用到了?
12.MQ 消息发送不在 MySQL 事务中如何保证一致性?
13.Kafka 四个选举,Controller 选举、Partition leader 选举、GroupCoordinator 选举、消费组协调器选举。整体设计问题,使用场景,流量规划怎么做的?
14.缓存使用的具体场景,一致性问题,缓存使用常见问题有哪些?
15.熔断和降级的区别,具体使用场景有哪些?
16.QPS 和 TPS 的区别是什么?你们系统的最大 QPS 是多少?QPS 大了会有什么问题,怎么解决?
17.如何设计一个 RPC 框架?需要考虑哪些点?
18.有没有关注新技术?log4j2 问题关注没有?能简单介绍一下吗?
总结:面试难度偏低,总监面基本是聊一下场景设计问题,面试体验很好,总监特别尊重人,强烈好评。待遇还行。
拼多多
1.介绍自己做过的最满意的一个项目
2.介绍 TiDB、RocksDb、levelDB、LSM 树、SSTable。
3.XXL-Job 二次分片怎么做的?有些什么问题?怎么去优化的?
4.HashMap 的位操作,HashSet 的 contains 方法复杂度是多少,红黑树简单讲一下?
5.byte[] a = new byte[10 * 1024]内存分配过程?多大的对象直接进入老年代?通过什么参数配置?
6.介绍 TLAB,PLAB,CAS 分配。
7.为什么要指针压缩,为什么能指针压缩?原理是什么?
8.类加载过程?类隔离了解过吗?
9.多态和重载的底层实现原理,字节码层面的了解过吗?
10.Springboot 自动装配,SPI 原理讲一下?
11.拦截器和过滤器的区别?使用场景?
12.Spring 事务实现原理,Spring 的 ACID 如何实现的?如果让你用 JDBC 实现事务怎么实现?
13.MySQL 的锁,表级锁是哪一层的锁?行锁是哪一层的锁?
14.MySQL 索引?B+树?主键索引每一个节点的大小?一个 page 多大?如果一条数据大于 16KB 怎么存?text 最多存多少数据?行溢出问题?数据存储格式有哪些?溢出页如何管理?15.Redis ssd,Redis 内存空间优化的点,embstr 和 row、intset、ziplist。
16.Kafka 的服务端的物理存储架构是什么?零拷贝,mmap,sendfile、DMA gather。
17.你做的方案怎么让别人信服?要考虑哪些点?你是怎么做的?有哪些你觉得可以改进的地方?
18.如果系统流量突然上升 10 倍,怎么处理?100 倍呢?
19.白板编程:单例模式,为什么要加 volatile
20.白板编程:用栈实现一个线程安全、高效的队列
21.白板编程:二叉树两个节点的距离
总结:一面难度较高,会一直追问问到你不会为止,后几轮的面试偏业务和设计,比较轻松。待遇拉满。
美团
1.多少个服务,多少台机器?K8S,怎么做到隔离?
2.服务之间的数据一致性怎么做?业务上怎么保证?
3.TCC?二阶段提交,三阶段提交?
4.Synchronized,偏向锁聊了很久聊到了源码,升级过程,Synchronized 的 JVM 源码?(面试官对 JVM 很感兴趣)
5.安全点,安全点的作用?一些 JVM 源码(之前的文章写过,面试官和感兴趣)
6.垃圾回收算法;PS+PO,CMS 为什么要用标记清除算法?CMS 的前身,R 大的文章。
7.ZGC,聊到了彭寒成的《新一代垃圾回收器 ZGC 设计与实现》和美团技术团队的文章。
8.G1,聊到了中村成洋的《深入 Java 虚拟机:JVM G1GC 的算法与实现》。
9.写屏障和读屏障的区别是什么?
10.JMV 优化过程,效果。为什么要升级垃圾收集器?
11.介绍一下 Spring IOC,注解和 XML 两种方式有什么区别?后置处理器,扩展点有什么用?在项目中有用到过吗?
12.MySQL 的 binlog、redo log、undo log 写入过程?刷盘机制和参数设置。MVCC 机制了解吗?
13.遇到的死锁问题?唯一键冲突导致的死锁问题,MySQL 为什么要这么设计?隐式锁是什么了解吗?
14.还了解 MySQL 的哪些锁?间隙锁、临检锁.....
15.ZK 的选举过程是怎么样的?如果选举过程中网络故障怎么办?ZAB 和 RAFT 的最大区别是什么?
16.Redis 用的 Gossip 协议有哪些具体消息?谣言传播,为什么要去中心化?有哪些优缺点?
17.Redis 分布式锁和 ZK 分布式锁的比较。AP 和 CP,CAP 理论讲一下?
18.Kafka 的优势是什么?RocketMQ 延迟队列怎么做的?如果让你优化你会怎么做?Kafka 能实现延迟队列吗?
19.Kafka 能保证数据一条都不丢失吗?为什么?业务上丢数据了怎么办?
20.白板编程:顺时针打印矩阵
总结:美团的面试官很喜欢问并发编程和 JVM,一面一直在聊这些东西,后几轮的面试偏业务和场景问题,比较轻松。
面试官很尊重人,还加了面试官的微信,后来面试官还给我打电话要我去美团,因为有其他选择了就拒掉了,祝好!
字节
略
总结:算法难度拉满,一轮一道算法,因为面的是 GO 岗位,对基础要求比较高,没有问太多 Java 的知识点。待遇不错。
58 集团
1.MySQL 迁移到 TiDB 做了哪些工作,自增主键,数据量多大?
2.TiDB 的性能问题,做了哪些调研?TP90、TP95 是多少。
3.TiDB 上线步骤是怎么样?怎么做到数据不丢失?怎么保证可靠性?
4.XXL-Job 怎么封装的?任务跑失败了怎么办?
5.DAG 是如何实现的?二次分片怎么做的?
6.Redis 使用场景、缓存什么数据?怎么保证数据一致性?
7.还了解 Redis 哪些知识、Redis 的优势、CP 还是 AP?CAP 理论。
8.Redis 存储数据需要注意哪些问题?热 key 问题、大 key 问题怎么处理?
9.Redis 分布式锁、红锁。红锁有什么问题?
10.介绍 SpringBean 创建过程、AOP 实现原理?
11.BeanFactory 和 FactoryBean 的区别?
12.Spring 是怎么解决循环依赖的?Spring 解决构造方法注入的循环依赖了吗?解决多例下的循环依赖了吗?
13.动态代理,JDK 动态代理和 CGlib 动态代理的区别?Spring 是如何选用的?怎么配置?
14.如何做降级的?如何做限流?
15.负载均衡算法有哪些?自适应负载均衡怎么做的?有什么问题?怎么优化的?
16.Java 的集合都有哪些,都有什么特点?
17.HashMap、ConcurrentHashMap 的区别?扩容过程是怎么样的?
18.介绍 AQS、CountDownLatch、Semaphore、volatile、synchronized
19.线程池、自定义线程池、自定义拒绝策略有了解过吗?什么场景用?
总结:面的是风控部门,老牌公司了,面试难度较低,钱也给的少。
滴滴
1.进程和线程的区别是什么?进程之间怎么通信的?线程之间呢?
2.HTTPS 和 HTTP 对比;CA 数字证书;对称加密非对称加密过程?
3.常见的加密算法有哪些?
4.MySQL 测试,TiDB 测试,如何做到平滑迁移?如何保证数据不丢失?
5.任务调用中心怎么做的?负载均衡?怎么收集执行器的 CPU 和内存使用情况?任务分片是怎么做的?
6.任务幂等性改造?ZK 怎么部署的,几台机器,挂了一台怎么办?
7.ZAB 协议,ZK 选举过程,ZXID 的结构是怎么样的?ZXID 有什么用?
8.Redis 的 String 底层结构,hash 底层结构,rehash 过程是怎么样的?
9.Redis 的 AOF 和 RDB 区别,能配合使用吗?热 key 问题和大 key 问题怎么解决?
10.Kafka 的 log,index,稀疏索引。零拷贝,mmap,sendfile、DMA gather
11.Kafka rebalance 策略,具体过程。GroupCoordinator 选举、消费组协调器选举过程?kafka 默认 topic 干什么用的?
12.Spring 的循环依赖怎么解决的,为什么需要加个三级缓存,二级不行么?
13.Springboot 有什么特点,了解 springboot 的自动装配原理么?
14.写了一道 LeetCode 原题,交换链表节点。
总结:面的是网约车部门,主要语言是 GO,面试体验不错,面试官比较尊重人,钱给的还行。
欧科云链
1.QUIC/HTTP3 了解吗?
2.用笔画 MySQL 一条记录的入库过程,写日志过程,日志两阶段提交?
3.JVM 调优过程?怎么发现 JVM 的问题的?怎么做预警处理?
4.Minor GC 与 Full GC 的触发机制是什么?
5.Eden 和 Survivor 比例可以调整么,参数是什么?还用到了哪些参数?
6.介绍 TiDB 和 MySQL 的迁移过程?遇到了些什么问题?怎么解决的?
7.了解 RocksDb 吗?levelDB、LSM 树、SSTable?
8.Paxos 算法了解吗?介绍 RAFT 和 ZAB,以及它们之间的区别?会有脑裂问题吗?为什么?
9.Kafka 消息的写入过程简单介绍一下,Kafka 为什么这么快?
10.Kafka 几种选举过程简单介绍一下?
11.Kafka 高水位了解过吗?为什么 Kafka 需要 Leader Epoch?
12.Netty 用到过吗?讲讲 reactor。Netty 的空轮询 bug 有了解吗?
13.讲讲 BIO、NIO、AIO 的区别?
14.Dubbo 的服务发现是怎么做的?
15.Redis 的几种数据结构,底层分别是怎么做的?用 Redis 缓存什么数据?怎么更新数据?怎么淘汰数据?
16.缓存和数据库一致性问题怎么解决?为什么要删缓存而不是更新缓存?删缓存删失败了怎么办?
17.有一个包含 100 亿个 URL 的大文件,假设每个 URL 占用 64B,请找出其中所有重复的 URL。
18.给了一张纸,上面有一段并发的代码,问执行结果是什么,考的是 volatile。
总结:面的是数字货币交易系统,去现场面的试,画了很多架构图。面试体验很好,还加了面试官的微信。待遇不错,而且可以居家办公。
京东
1.介绍一下你做的项目?
总结:这个面试官放了我两次鸽子,后面突然打电话过来,我匆匆忙忙接电话,介绍完项目之后,他随便问了几个问题就结束了,整个过程不超过 10 分钟。可能是因为我不是东哥的兄弟?
结果
说一下结果吧,除了京东,其余的都拿到了口头 offer。
至于为什么没有面阿里和腾讯,因为那个时候阿里和腾讯在进行财年清算,锁 HC 了,也就没有面了。
至于为什么字节的面试题没写,懂得都懂...
最后,祝大家都能成为 offer 收割机!
Java面试复习资料
为了更好的帮助到大家,小编特地准备了大厂面试真题、Java书籍资料、Java面试题总结等Java资料,需要的小伙伴点赞之后,直接【点击此处】即可免费获取!!!