作者:月伴飞鱼
最近一段时间面试了几家互联网公司,陆续通过了阿里、头条、美团,滴滴,京东的面试,基本上面试的公司都通过了,所以在这里想分享一些自己面试的经验给大家,希望能帮助大家拿到心仪的 offer
我的基本情况:19 届本科,现在在一家小公司,毕业一年半,后端开发
面试准备
简历
重点放在专业技能和项目经验两块
- 你的简历就是你给面试官提供的考点,简历上的东西必须自己 Hold 住,万一自己写的东西被问住了,会很尴尬,给面试官留下的印象也不好,所以就是会啥写啥
- 技术栈最好不要写精通,你敢写面试官就敢问,被问倒了很尴尬的,写熟悉,了解就行
怎么投简历
我这里强烈建议找人内推,这样简历通过的概率大些,如果找不到,可以试试脉脉,我就是从脉脉投的简历,把状态改成寻找机会就行,会有很多人找你的
推荐一个简历制作模版,我一直用的: https://www.polebrief.com/index 。
算法
这个该刷还是得刷,别偷懒,我个人感觉刷完下面几个已经够了,大家可以根据自己的基础情况选择
- 剑指 Offer:https://www.nowcoder.com/ta/coding-interviews
- 刷 Leetcode,刷 Leetcode,刷 Leetcode!重要的事情说三遍,Leetcode 前 200 道
- 经典排序算法:https://blog.csdn.net/qq_35508033/article/details/109399281
复习
我复习主要以看书为主,推荐一些我看的书籍和资料,有时间的话尽量看的细一点,多看几遍,没时间的话就挑重点看
- 并发编程:Java 并发编程的艺术,Java 发编程实战
- JVM:深入理解 Java 虚拟机
- Redis:Redis 设计与实现,Redis 开发与运维
- MySQL:高性能 MySQL,MySQL 技术内幕
- SpringBoot 和 SpringCloud:https://blog.didispace.com/
- Kafka:Apache Kafka 实战
- 设计模式:大话设计模式,设计模式之禅
- 分布式:从 Paxos 到 Zookeeper 分布式一致性原理与实践
需要书籍的 pdf 文档可以关注我的公众号,月伴飞鱼,回复 666 获取
项目经验
社招面试项目很重要,不光是你项目本身的技术复杂度,还有业务复杂度,你本身在项目中担任的什么角色,遇到过什么问题,瓶颈在哪,怎么解决的,这几个问题是非常重要的,很多公司到最后基本上都是围绕着你的项目在问,给面试官讲明白你的项目是必须具备的能力
总结下社招面试问项目最主要的问题套路:
- 你项目为什么这么设计,你这样设计有什么好处,解决了什么问题,会产生什么问题,还有什么可以优化的
- 这么设计有什么瓶颈吗,遇到了什么问题,有什么改善的方案
- 项目遇到的难点,技术挑战,你是怎么解决的,为什么用这种方式解决,还有更好的方式么
- 根据你简历上提到的具体功能去扣细节
面试技巧
- 面试得自信且谦虚,声音自信,面试表现谦虚,得给面试官一种你啥都会,很稳的感觉(实际内心很慌),然后语言表达流畅,吐字清晰,回答问题也要有逻辑性,不能支支吾吾半天说不明白,面试官都听不懂,这就很尴尬了,这个可以自己多练习一下
- 面试本质是一个自我优势展示的过程,不要让面试官问一句自己回答一句,主动抛出一些可能的点让面试官来主动问你,还有就是不会的问题就说不会,这个没关系的,千万别瞎说
- 不要眼高手低,不少小伙伴看面经觉得自己啥都会,但是会与面试过程中能清晰有层次的说出来是两回事,费曼学习法可以了解一下,举个例子:比如 sychronized 的原理,能不能说出点面试官眼前一亮的东西,这还是不容易的,其实面试主要是证明你比别人更有技术的深度,广度,不然都是背八股文,那面试官看不出你有什么不一样的,这个面试过的概率就大大降低了
个人建议,面试没准备好,不要随便面试,一些大厂都会有面试评价记录,太多差评影响以后的面试,同时面完之后要多总结,复盘,整理知识点,查漏补缺
面试最后
面试结束时问面试官什么问题
我一般会问:
- 我面试的岗位的具体工作是什么
- 使用的技术栈有哪些
面试总结
阿里的面试更倾向于实用性,基本是从各种场景出发,来给你一个场景,让你来解决实际的问题,那么在解决问题的过程中,对于各种知识的应用就是亮点了
头条更看重计算机基础,算法,以及对各种中间件的了解
面试也有不少的运气成分的,毕竟每个面试官的侧重点可能不一样,大家放平心态就好
学习建议
学习要形成自己的知识体系,不要天天盯着别人的面经(当然,我的面经可以看,哈哈)做碎片化学习,面经只是辅助作用,查漏补缺的,一旦你的知识体系有了,很多问题都能举一反三,这时候面试就很稳了
下面是热乎乎的面经
注意:有些面试的题目比较少,因为有些面试题因为会被多个公司重复问 ,就不重复写了
美团
一面
- 线程安全的类有哪些,平时有使用么,用来解决什么问题
- mysql 日志文件有哪些,分别介绍下作用
- 你们项目为什么用 redis,快在哪,怎么保证高性能,高并发的
- redis 字典结构,hash 冲突怎么办,rehash,负载因子
- jvm 了解哪些参数,用过哪些指令
- zookeeper 的基本原理,数据模型,znode 类型,应用场景有哪些
- 一个热榜功能怎么设计,怎么设计缓存,如何保证缓存和数据库的一致性
- 容器化技术了解么,主要解决什么问题,原理是什么
- 算法:对于一个字符串,计算其中最长回文子串的长度
- 项目介绍
美团
因为之前的部门一面通过后,该部门没有 hc 了,就给我推荐到其他部门了,大厂 hc 还是挺紧张的
一面
- redis 集群,为什么是 16384,哨兵模式,选举过程,会有脑裂问题么,raft 算法,优缺点
- jvm 类加载器,自定义类加载器,双亲委派机制,优缺点,tomcat 类加载机制
- tomcat 热部署,热加载了解么,怎么做到的
- cms 收集器过程,g1 收集器原理,怎么实现可预测停顿的,region 的大小,结构
- 内存溢出,内存泄漏遇到过么,什么场景产生的,怎么解决的
- 锁升级过程,轻量锁可以变成偏向锁么,偏向锁可以变成无锁么,自旋锁,对象头结构,锁状态变化过程
- kafka 重平衡,重启服务怎么保证 kafka 不发生重平衡,有什么方案
- 怎么理解分布式和微服务,为什么要拆分服务,会产生什么问题,怎么解决这些问题
- 你们用的什么消息中间件,kafka,为什么用 kafka,高吞吐量,怎么保证高吞吐量的,设计模型,零拷贝
- 算法 1:给定一个长度为 N 的整形数组 arr,其中有 N 个互不相等的自然数 1-N,请实现 arr 的排序,但是不要把下标 0∼N−1 位置上的数通过直接赋值的方式替换成 1∼N
- 算法 2:判断一个树是否是平衡二叉树
二面
- Innodb 的结构了解么,磁盘页和缓存区是怎么配合,以及查找的,缓冲区和磁盘数据不一致怎么办,mysql 突然宕机了会出现数据丢失么
- redis 字符串实现,sds 和 c 区别,空间预分配
- redis 有序集合怎么实现的,跳表是什么,往跳表添加一个元素的过程,添加和获取元素,获取分数的时间复杂度,为什么不用红黑树,红黑树有什么特点,左旋右旋操作
- io 模型了解么,多路复用,selete,poll,epoll,epoll 的结构,怎么注册事件,et 和 lt 模式
- 怎么理解高可用,如何保证高可用,有什么弊端,熔断机制,怎么实现
- 对于高并发怎么看,怎么算高并发,你们项目有么,如果有会产生什么问题,怎么解决
- 项目介绍
- 算法:给定一个二叉树,请计算节点值之和最大的路径的节点值之和是多少,这个路径的开始节点和结束节点可以是二叉树中的任意节点
三面
- 项目介绍
- 算法:求一个 float 数的立方根,牛顿迭代法
- 什么时候能入职,你对岗位的期望是什么
- 你还在面其他公司么,目前是一个什么流程
阿里
一面
- synchronized 原理,怎么保证可重入性,可见性,抛异常怎么办,和 lock 锁的区别,2 个线程同时访问 synchronized 的静态方法,2 个线程同时访问一个 synchronized 静态方法和非静态方法,分别怎么进行
- volatile 作用,原理,怎么保证可见性的,内存屏障
- 你了解那些锁,乐观锁和悲观锁,为什么读要加锁,乐观锁为什么适合读场景,写场景不行么,会有什么问题,cas 原理
- 什么情况下产生死锁,怎么排查,怎么解决
- 一致性 hash 原理,解决什么问题,数据倾斜,为什么是 2 的 32 次方,20 次方可以么
- redis 缓存穿透,布隆过滤器,怎么使用,有什么问题,怎么解决这个问题
- redis 分布式锁,过期时间怎么定的,如果一个业务执行时间比较长,锁过期了怎么办,怎么保证释放锁的一个原子性,你们 redis 是集群的么,讲讲 redlock 算法
- mysql 事务,acid,实现原理,脏读,脏写,隔离级别,实现原理,mvcc,幻读,间隙锁原理,什么情况下会使用间隙锁,锁失效怎么办,其他锁了解么,行锁,表锁
- mysql 索引左前缀原理,怎么优化,哪些字段适合建索引,索引有什么优缺点
- 线上遇到过慢查询么,怎么定位,优化的,explain,using filesort 表示什么意思,产生原因,怎么解决
- 怎么理解幂等性,有遇到过实际场景么,怎么解决的,为什么用 redis,redis 过期了或者数据没了怎么办
二面
- hashmap 原理,put 和 get,为什么是 8 转红黑树,红黑树节点添加过程,什么时候扩容,为什么是 0.75,扩容步骤,为什么分高低位,1.7 到 1.8 有什么优化,hash 算法做了哪些优化,头插法有什么问题,为什么线程不安全
- arraylist 原理,为什么数组加 transient,add 和 get 时间复杂度,扩容原理,和 linkedlist 区别,原理,分别在什么场景下使用,为什么
- 了解哪些并发工具类
- reentrantlock 的实现原理,加锁和释放锁的一个过程,aqs,公平和非公平,可重入,可中断怎么实现的
- concurrenthashmap 原理,put,get,size,扩容,怎么保证线程安全的,1.7 和 1.8 的区别,为什么用 synchronized,分段锁有什么问题,hash 算法做了哪些优化
- threadlocal 用过么,什么场景下使用的,原理,hash 冲突怎么办,扩容实现,会有线程安全问题么,内存泄漏产生原因,怎么解决
- 垃圾收集算法,各有什么优缺点,gc roots 有哪些,什么情况下会发生 full gc
- 了解哪些设计模式,工厂,策略,装饰者,桥接模式讲讲,单例模式会有什么问题
- 对 spring aop 的理解,解决什么问题,实现原理,jdk 动态代理,cglib 区别,优缺点,怎么实现方法的调用的
- mysql 中有一个索引(a,b,c),有一条 sql,where a = 1 and b > 1 and c =1;可以用到索引么,为什么没用到,B+树的结构,为什么不用红黑树,B 树,一千万的数据大概多少次 io
- mysql 聚簇索引,覆盖索引,底层结构,主键索引,没有主键怎么办,会自己生成主键为什么还要自定义主键,自动生成的主键有什么问题
- redis 线程模型,单线程有什么优缺点,为什么单线程能保证高性能,什么情况下会出现阻塞,怎么解决
- kafka 是怎么保证高可用性的,讲讲它的设计架构,为什么读写都在主分区,这样有什么优缺点
- 了解 DDD 么,不是很了解
- 你平时是怎么学习的
- 项目介绍
三面
- 线程有哪些状态,等待状态怎么产生,死锁状态的变化过程,中止状态,interrupt()方法
- 你怎么理解线程安全,哪些场景会产生线程安全问题,有什么解决办法
- mysql 多事务执行会产生哪些问题,怎么解决这些问题
- 分库分表做过么,怎么做到不停机扩容,双写数据丢失怎么办,跨库事务怎么解决
- 你们用的 redis 集群么,扩容的过程,各个节点间怎么通信的
- 对象一定分配在堆上么,JIT,分层编译,逃逸分析
- es 的写入,查询过程,底层实现,为什么这么设计
- es 集群,脑裂问题,怎么产生的,如何解决
- while(true)里面一直 new thread().start()会有什么问题
- socket 了解么,tcp 和 udp 的实现区别,不了解,用的不多
- 设计一个秒杀系统能承受千万级并发,如果 redis 也扛不住了怎么办
- 项目介绍
四面
- 讲讲你最熟悉的技术,jvm,mysql,redis,具体哪方面
- new Object[100]对象大小,它的一个对象引用大小,对象头结构
- mysql 主从复制,主从延时怎么解决
- 怎么保证 redis 和 mysql 的一致性,redis 网络原因执行超时了会执行成功么,那不成功怎么保证数据一致性
- redis 持久化过程,aof 持久化会出现阻塞么,一般什么情况下使用 rdb,aof
- 线上有遇到大流量的情况么,产生了什么问题,为什么数据库 2000qps 就撑不住了,有想过原因么,你们当时怎么处理的
- 限流怎么做,如果让你设计一个限流系统,怎么实现
- dubbo 和 spring cloud 区别,具体区别,分别什么场景使用
- 给了几个场景解决分布式事务问题
- 项目介绍
- 你觉得你们的业务对公司有什么实际价值,体现在哪,有什么数据指标么
五面
hr 面完后又来了一面,说是交叉面
- 怎么理解用户态,内核态,为什么要分级别,有几种转换的方式,怎么转换的,转换失败怎么办
- 怎么理解异常,它的作用是什么,你们工作中是怎么使用的
- 你们用 redis 么,用来做什么,什么场景使用的,遇到过什么问题,怎么解决的
- jvm 元空间内存结构,永久代有什么问题
- 你平时开发中怎么解决问题,假如现在线上有一个告警,你的解决思路,过程
- 你们为什么要用 mq,遇到过什么问题么,怎么就解决的
- 你觉得和友商相比,你们的优势在哪
- 聊天:炒股么,为什么买 B 站,天天用,看好他
菜鸟
不知道为啥可以同时两个流程,可能真的缺人(想去阿里的大家抓紧机会)
算是给我 2 次选择机会了,面了几面(2 面只用了 11 分钟,哈哈),主要问项目了
抖音
感觉头条不怎么问项目,或许是我项目太 low 了,比较喜欢问计算机基础和中间件知识
一面
- http 请求头,expire,cache-control 字段,状态码,301,302,401,403
- https 原理,数字签名,数字证书,非对称加密算法过程,有什么问题
- tcp 连接 client 和 server 有哪些状态,time_wait 状态
- 虚拟内存,虚拟地址和物理地址怎么转换,内存分段,内存分页,优缺点
- linux 最多可以建立多少个 tcp 连接,client 端,server 端,超过了怎么办
- eureka 原理,强一致性么,为什么,怎么保证强一致性,多级缓存怎么保证一致性,eureka 集群,宕机了服务还能调用么
- hystrix 原理,半开状态知道么,具体的一个转换过程,它的隔离是怎么实现的
- zookeeper 一致性保证,zab 协议原理,半数原则如果查询到另外一半呢,那 zookeeper 属于哪种一致性,强一致性么,还是最终一致性
- zookeeper 选举机制,选举过程有什么问题
- 算法:最长不重复的连续子串
- 聊天:头条为什么用 go,对 java 和 go 怎么看,愿意转 go 么
二面
- 函数 a 调用函数 b 的过程,是怎么传参的
- java 里面的函数调用有哪些,io 流里面有函数调用么
- fork 函数,父子进程的区别,孤儿进程,僵尸进程会有什么问题,进程有哪些状态,进程间怎么同步,通信,消息队列,管道怎么实现的,进程调度算法,各有什么优缺点
- dos 攻击,ddos 攻击,drdos 攻击,怎么解决,syn flood
- 自旋锁,线程上下文切换的开销具体是什么,中断,有哪些中断,用户态和内核态切换过程
- 一张大表怎么更改表的数据结构,字段,用 alter 会有什么问题,怎么解决呢,有什么好的方案,双写的话会有什么问题,还有其他方案么
- redis 管道用过么,用来做什么,它的原理是,保证原子性么,和事务的区别,redis 事务保证原子性么
- redis 强一致性么,怎么保证强一致性,有什么方案
- kafka 怎么保证消息不丢失的
- 算法:找出所有相加之和为 n 的 k 个数的组合,组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字,输入: k = 3, x = 9 输出: [[1,2,6], [1,3,5], [2,3,4]]
三面
感觉面试官很忙,就问了几个电商场景的技术解决方案
算法:一个环上有 10 个点,编号为 0-9,从 0 点出发,每步可以顺时针到下一个点,也可以逆时针到上一个点,求:经过 n 步又回到 0 点有多少种不同的走法
举例:
如果 n=1,则从 0 出发只能到 1 或者 9,不可能回到 0,共 0 种走法
如果 n=2,则从 0 出发有 4 条路径:0->1->2, 0->1->0, 0->9->8, 0->9->0,其中有两条回到了 0 点,故一共有 2 种走法
快手
感觉像刷 kpi 的,一看 JD 发现招的资深研发工程师,我对快手的印象又不好了
一面
手写 hashmap(卒)
滴滴
一面
- 排序算法了解哪些,快排,快排复杂度,优化,堆排序,建堆过程
- 反射了解么,原理是什么
- treemap 和 linkdedhashmap 区别,实现原理
- jvm 类加载的过程讲讲,符号引用是什么,哪些情况会发生初始化
- spring 的循环依赖,怎么解决的,为什么需要加个三级缓存,二级不行么
- springboot 有什么特点,相比与 spring,了解 springboot 的自动装配的一个原理么
- kafka 支持事务么,你们项目中有使用么,它的原理是什么
- 怎么统计一亿用户的日活,hyperloglog 有什么缺点,bitmap 不行么
- 算法:求一个环形链表的环的长度
二面
- redis 的几种数据类型,你们用过哪些,zset 有用来做什么
- 垃圾收集器,cms 垃圾收集过程,为什么停顿时间短,有什么缺点,concurrent mode failure 怎么办,内存碎片怎么解决,为什么不用标记整理法
- 线程池原理,核心参数,线程数设置,参数动态调整后变化过程,Tomcat 线程池原理,常用的线程池,你们一般使用哪种,为什么,会有什么问题,线程抛异常怎么办,阻塞队列原理
- 做过分库分表么,为什么要分库分表,会有什么问题,多少数据适合分库分表,跨库,聚合操作怎么做
- 项目介绍
- 算法:给定一个二叉树, 找到该树中两个指定节点的最近公共祖先
- 你对自己有什么规划,想学习什么技术,最近在看什么书
三面
- nio 讲讲,实现原理,优缺点
- 了解 netty 么,讲讲 netty 的设计模型,架构,使用场景
- zookeeper 读写数据过程
- 项目介绍
京东
一面
- tcp 和 udp 的区别,tcp 怎么保证可靠连接的,出现网络拥塞怎么解决
- tcp 和 udp 的报文结构了解么
- 给了一个业务场景写 sql 语句
- 你们建表会定义自增 id 么,为什么,自增 id 用完了怎么办
- 一般你们怎么建 mysql 索引,基于什么原则,遇到过索引失效的情况么,怎么优化的
- jvm 内存结构,堆结构,栈结构,a+b 操作数栈过程,方法返回地址什么时候回收,程序计数器什么时候为空
- redis 实现分布式锁,还有其他方式么,zookeeper 怎么实现,各有什么有缺点,你们为什么用 redis 实现
- 算法:返回一个树的左视图
二面
- spring 你比较了解哪方面,讲讲,生命周期,bean 创建过程
- 使用过事务么,遇到过事务失效的情况么,原因是什么
- springboot 是怎么加载类的,通过什么方式
- 什么对象会进入老年代,eden 和 survivor 比例可以调整么,参数是什么,调整后会有什么问题
- 微信朋友圈设计,点赞,评论功能实现,拉黑呢,redis 数据没了怎么办
- 项目介绍
- 算法:给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。
- 请你将两个数相加,并以相同形式返回一个表示和的链表
三面
感觉面试官对 es 很熟悉,一直问 es 问题
- es 倒排索引,原理,lucene,分词,分片,副本
- es 写数据原理,数据实时么,为什么不实时,会丢数据么,segment,cache,buffer,translog 关系
- es 深度分页,优化
- 项目介绍
- 算法:验证二叉搜索树