从去年年中一直到今年年初,我面阿里总共面了5-6次,经历了三次完整的4轮技术面 + 1轮HR面,目前将面试过程和常见题目记录一下,供参考。
面试流程
面试轮次
阿里社招一般都是P6级别以上,技术面4轮以上 + 1轮HR面。
阿里校招一般都是P4、P5级别,技术面3轮 + 1轮HR面。
面试侧重点
以社招P6为例,来看看每轮考察的侧重点。
一面
一面面试官一般是你组内师兄或组长,主要考察Java基础、中间件原理以及项目经历;面试时长30-60分钟。
Java基础和中间件考察范围会在文末附上。
项目经历这块,选择一个具有代表性的讲解即可,这里指的代表性,建议选择和应聘岗位相关度稍高,难度稍大的项目,保证讲解时长处于10-15分钟左右为宜。若项目讲解时长较短,其他考察点(Java基础和中间件原理等)会涉及的非常深入,加大面试难度。
二面
二面面试官一般是团队负责招聘的技术或其他组组长,有时甚至就是一面面试官,主要考察算法,算法这块的背考就刷LeetCode或牛客网即可,保证刷完300题较为保险,至少要刷完100道。
LeetCode:https://leetcode-cn.com/problemset/all/ (中文版)
牛客网:https://www.nowcoder.com/ta/coding-interviews?page=1 (剑指offer)
算法这块的考察一般是面试官发送面试链接,面试者进入链接然后写代码即可,一般题量在1-3道,面试时长30-60分钟。偶尔需要开视频哦。
笔试代码一般不强制要求100%可运行,但是尽可能保证自己的代码可顺利运行,包括main方法的测试用例。这里切记,不会写的地方,宁可写思路,也不要写存在重大bug的代码。
三面
三面面试官一般为你所在部门的主管,侧重考查项目难点、中间件底层实现以及场景题。从三面开始,考题就比较宽泛了,一般45分钟左右。
这里一定要准备好项目中遇到的难点问题,如果准备的不好,面试官会diss你,甚至面试评价中会写上几笔,影响你最终的录取。
有的同学可能会问,我们参与的很多项目都是偏业务,基本没什么难点。如果业务量比较大,如QPS达到万级别及以上,你可以往高可用等保障策略上讲解。如果业务量确实较小,可以往复杂的功能实现上讲解,这里可"发挥"的空间就比较大了,实在目前没有复杂的功能,可以往后期可以优化或即将要做的功能上讲解。
四面
四面面试官一般是你部门主管的上级或其他部门的主管,侧重中间件底层、场景题以及个人发展规划等,开放性较大,一般30分钟左右。
比较有意思的是,某一次四面面试官问,你最近在看什么书,最想推荐给我的是哪一本,为什么?这里就需要各位平时在日常开发之余,还是需要不断充电啊。
HR面
HR一般是你所在部门的HRG,考察一般侧重你个人发展,常见问题:
- 最近几次离职的原因;
- 当前的职级、薪资情况以及期望薪资;
- 你认为在当前公司中遇到的最大的挑战是什么;
- 你在当前公司得到了哪些提升;
- 你对未来的职业规划是怎样的;
- 你认为你和其他求职者相比有哪些优点;
- 项目讲解(这里不要偏向技术,偏业务的讲解就行,偶尔会diss你,要抗住);
- 你到公司最大的期望是什么;
经过四轮技术 + 一轮HR大概率稳了,但是偶尔可能会有一些小插曲,比如HC被锁、大老板针对你的面试评价保持怀疑态度等都有可能导致你的offer审批不下来。
HR面之后一周左右HR会通知你的offer方案,这个时候你经过前面的面试,对你的岗位工作也有了一定的了解,然后可以参考自己的offer方案再决定是否接下offer。
当你接下口头offer后,后续会安排体检(一周)和背调(一周),完成之后会发放书面offer,这个时候就妥了,等着入职吧。
面试宝典
Java基础、中间件基础
以下是面试期间整理的面试题目录,具体内容就不贴了,建议大家自己动手整理,加深印象。
- 为什么重写equals()方法就必须重写hashCode()方法?
- Object有哪些方法?
- 接口和抽象类的区别,什么情况下用接口或抽象类?
- 为什么String设计成不可变?String 和 StringBuilder、StringBuffer 的区别?
- String s = new String(“abc”) 和 String s = “abc” 的区别?
- Arraylist、HashMap的初始容量、加载因子、扩容增量?
- 有序的Map有哪些?为什么TreeMap是有序的?哪些集合是线程安全的?
- HashMap的底层数据结构,是如何插入的?哈希冲突解决方案?为什么是非线程安全的?
- HashMap为什么初始容量总是2的n次方?
- ConcurrentHashMap 和 Hashtable 的区别?
- synchronized的使用方式、底层实现以及JDK1.6的优化?
- 谈谈 synchronized和ReentrantLock 的区别?
- Java内存模型及volatile实现原理?
- volatile和synchronized的区别,volatile一定能替代synchronized吗?
- CountDownLatch、CyclicBarrier、Semaphore、LockSupport和Exchanger?
- ThreadLocal实现原理强引用、软引用、弱引用、虚引用?
- JDK提供的并发容器CopyOnWrite、ArrayListBlockingQueue(阻塞队列FIFO)ConcurrentLinkedQueue(非阻塞队列)等实现方式?
- CAS
- ReentrantLock的实现?
- 多线程的实现方式,start()是立刻启动吗?
- ThreadPoolExecutor的重要参数?执行顺序?如何设置参数?
- 什么是死锁,死锁的四个必要条件?
- Java内存区域?
- 对象的访问定位有哪两种方式?
- 如何判断对象是否死亡?(两种方法)
- 垃圾收集算法?常见的垃圾回收器?
- JVM参数?JVM调优?Full GC的触发条件?
- 一个线程OOM后,其他线程还能正常运行吗?
- 类加载过程?类加载器?Java字节码文件结构?
- BIO(Blocking I/O)、伪异步IO、NIO(New I/O)、AIO?
- 数据库查询缓慢是什么原因,如何优化?
- 索引实现?
- 大表优化?
- 如何实现MySQL的读写分离?
- 数据库的乐观锁和悲观锁?
- MySQL的锁机制?
- 数据库事务的特性(ACID)和隔离级别?
- MVCC实现可重复读?
- RC隔离级别下,读A行数据,updateA 行数据,读B行数据,updateB行数据,再updateA行数据,请问加了几次锁?对A加锁是在什么时候加了几次锁?
- MySQL的事务实现?何时加行锁?
- Redis数据结构及各结构的内部实现?
- Redis为什么快?
- Redis通信协议?
- Redis事务?
- Redis 的过期策略以及内存淘汰机制?
- Redis持久化方式?
- Redis主从复制机制redis 集群模式的工作原理能说一下么?在集群模式下,redis 的 key 是如何寻址的?分布式寻址都有哪些算法?了解一致性 hash 算法吗?
- Redis 和 DB 一致性?缓存穿透?缓存击穿?缓存雪崩?缓存清洗?并发竞争Key?
- Spring的优点,用到了哪些设计模式,IOC和AOP的理解?
- Bean的生命周期?
- 解释Spring支持的几种bean的作用域?
- BeanFactory、FactoryBean的区别?
- Spring如何处理单例Bean的循环依赖?
- SpringMVC、Mybatis 执行过程?
- Spring事务?
- SpringBoot最大的优势(三连问)?
- Spring Cloud Eureka 服务发现?
- Ribbon负载均衡?
- 为什么使用Dubbo?
- Dubbo服务注册原理?
- Dubbo提供的负载均衡策略?
- 如何基于 dubbo 进行服务治理、服务降级、失败重试以及超时重试?
- RabbitMQ Exchange 类型?
- 如何保证消息顺序性?
- 为什么使用消息队列?消息队列的缺点?常见的消息队列组件比较?
- MQ如何保证高可用?
- MQ如何处理重复消费?
- RabbitMQ消息堆积?
- MQ如何保证可靠传输?
- ES的分布式架构原理?
- ES写入数据的工作原理是什么啊?
- 底层的 lucene 介绍一下呗?倒排索引了解吗?
- ES在数据量很大的情况下(数十亿级别)如何提高查询效率?
- ES 生产集群的部署架构是什么?
- 分布式事务?
- 使用哪些组件或者方法可以提升网站性能、可用性以及并发量?
- 设计高可用(系统7×24小时不间断服务)系统的常用手段?
- 如何设计高并发系统?
- CAP和BASE理论?
- 分布式 ID 生成器?
- 基于 Redis 的分布式锁?
- Redis分布式锁过期了但业务没执行完?
- 内存溢出排查方法?CPU高负载排查方法?
- 如何保障双11狂欢下的99.99%高可用?
- 秒杀系统设计?
以上目录能覆盖一大部分考题,更加深入的底层原理、场景题等需要平时工作的沉淀思考以及框架源码的阅读总结。
建议平时工作之余,坚持阅读优秀的框架源码,这对面试答题以及日后编码具有极大的效应。以下列出部分推荐的源码:
- Java基础:集合、JUC
- DB:Redis、MongoDB、MySQL(任选其一,推荐Redis,相对简单)
- ORM:Mybatis、Spring Data Jpa、Hibernate (任选其一,选平时工作中使用频率来选即可)
- MQ:RabbitMQ、Kafka、RocketMQ、ActiveMQ(任选其一,选平时工作中使用频率来选即可,但还是推荐Kafka)
- J2EE:Spring、Spring Boot
- Web框架:Spring MVC、Spring Security、Spring Webflux(一般了解mvc即可,其他看兴趣)
- 注册中心:Eureka、Zookeeper(任选其一,推荐Eureka)
- 分布式事务:TCC Transaction、Seata、Fesar(任选其一,主要了解实现思路)
- 其他:Zuul、Hystrix、Redisson、Netty、Dubbo、Ribbon、ES、HBase
常考的已加粗,重点阅读总结。
具体的阿里内推机会可关注公众号进行了解和交流。