面试了很多家公司,感觉大部分公司考察的点都差不多,所以将自己的心得记下来,希望能给正在找或者准备找工作的朋友提供一点帮助。另外,目前在阿里也做面试官的工作,身份从求职者变为面试官,看问题的很多角度也不一样,所以下文中既有求职者的视角,也有面试官的视角。
面试流程
一般大公司都有3-4轮技术面,1轮的HR面。就阿里而言,我共经历了4轮技术面,前两轮主要是问基础和项目实现,第3轮是交叉面,两个面试官,主要是问项目实现和拓展。第4轮是部门老大面,主要就问一些架构、技术和业务的理解、个人发展比较抽象的东西了。
HR面主要就是跟你聊聊天,看看你的个人稳定性、价值观、主动性之类的,一般HR是不会挂人的,但很多人在HR面后挂了,原因其实不是你在HR面的表现不好(少数情况除外),而是你之前几面的表现一般,比60分要高一点(所以没在前面的面试直接挂了你),但是又没达到80分,这个时候公司基于hc、人才配比、与其他候选人的对比等多个维度考虑,最终决定是否给你offer。 另外要特别说下的是,今日头条对算法的考察会比较多,我面了4轮技术,每一轮都会问1到2个算法题,大概是leetcode上easy和medium难度。所以想去头条的同学最好先去刷刷题。 要注意的点 1.
简历一到两页为最佳,将项目经历写2-3个左右就差不多了,一定要写最有亮点的项目 2.
工作经历的起始时间要写清楚,另外大公司都有背调,不要合并或省略一些比较短的工作经历,影响的可能不只是这次面试,而是之后可能都无法进这家公司 3.
对于面试官的问题,想清楚再回答,如果觉得需要的时间可能比较长,可以跟面试官说我思考下、我整理下思路之类的 4. 5.
遇到不会的问题直接说不会,不要不懂装懂
遇到比较确定的问题,要有自信一点,有时候面试官可能会故意用怀疑的语气来考察你
6. 面试的过程中注意语速和吐字,本人在做面试官后,发现很多人说话语速很快,或吐字不清,导致原本会的问题也会让面试官觉得你没答到点上(尤其是电话面)
7. 8. 9.
面试过程中可以自信但不要与面试官争执 面试完后不要直接问面试结果
面试保持自信而不自大,曾经问一位候选人说对hashmap是了如指掌,结果问到hashmap扩容时需不需要重新计算hash就懵逼了。对于很多人来说,面试官总有办法把你问倒的。
10. 11.
每次面试后都总结有哪些答的不好的地方,有哪些知识点的盲区,解决掉。 被问到为什么想跳槽的时候,因该从自身发展等角度出发,而不是吐槽前
公司。
最重要的一点,不要因为几次的面试失败就开始怀疑自己,永远记住,面试的结果=实力+运气。有时候你擅长的东西可能面试官根本不会,所以他也不可能花很多时间去问他不懂的东西;有时候可能他问你的你都会,但是可能因为对方提问方式、语气等原因,答的就是不顺畅。 接下来说技术相关的考察
基础
以下都是我认为面试中经常会被考察到的知识点的整理,不够完整,但大部分都是常见面试题。
java基础 集合
集合分为两大块:java.util包下的非线程安全集合和java.util.concurrent下的线程安全集合。 List
ArrayList与LinkedList的实现和区别 Map
HashMap:了解其数据结构、hash冲突如何解决(链表和红黑树)、扩容时机、扩容时避免rehash的优化
? ?
?
LinkedHashMap:了解基本原理、哪两种有序、如何用它实现LRU TreeMap:了解数据结构、了解其key对象为什么必须要实现Compare接口、如何用它实现一致性哈希 Set
Set基本上都是由对应的map实现,简单看看就好 常见问题
1. hashmap如何解决hash冲突,为什么hashmap中的链表需要转成红黑树?
2. hashmap什么时候会触发扩容?
3. 4. 5. 6. 7.
jdk1.8之前并发操作hashmap时为什么会有死循环的问题? hashmap扩容时每个entry需要再计算一次hash吗? hashmap的数组长度为什么要保证是2的幂? 如何用LinkedHashMap实现LRU? 如何用TreeMap实现一致性hash?
线程安全的集合
Collections.synchronized 了解其实现原理
CopyOnWriteArrayList
了解写时复制机制、了解其适用场景、思考为什么没有ConcurrentArrayList ConcurrentHashMap
了解实现原理、扩容时做的优化、与HashTable对比。 BlockingQueue
了解LinkedBlockingQueue、ArrayBlockingQueue、DelayQueue、SynchronousQueue 常见问题
1. ConcurrentHashMap是如何在保证并发安全的同时提高性能?
2. 3. 4. 并发
ConcurrentHashMap是如何让多线程同时参与扩容? LinkedBlockingQueue、DelayQueue是如何实现的? CopyOnWriteArrayList是如何保证线程安全的?
synchronized
了解偏向锁、轻量级锁、重量级锁的概念以及升级机制、以及和ReentrantLock的区别 CAS
了解AtomicInteger实现原理、CAS适用场景、如何实现乐观锁 AQS
了解AQS内部实现、及依靠AQS的同步类比如ReentrantLock、Semaphore、CountDownLatch、CyclicBarrier等的实现 ThreadLocal
了解ThreadLocal使用场景和内部实现 ThreadPoolExecutor
了解线程池的工作原理以及几个重要参数的设置 常见问题
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. IO
synchronized与ReentrantLock的区别? 乐观锁和悲观锁的区别? 如何实现一个乐观锁?
AQS是如何唤醒下一个线程的?
ReentrantLock如何实现公平和非公平锁是如何实现?
CountDownLatch和CyclicBarrier的区别?各自适用于什么场景? 适用ThreadLocal时要注意什么?比如说内存泄漏? 说一说往线程池里提交一个任务会发生什么? 线程池的几个参数如何设置?
线程池的非核心线程什么时候会被释放? 如何排查死锁?
了解BIO和NIO的区别、了解多路复用机制 常见问题 1. 2. 3. 4. JVM
同步阻塞、同步非阻塞、异步的区别? select、poll、eopll的区别? java NIO与BIO的区别? refactor线程模型是什么?
GC
垃圾回收基本原理、几种常见的垃圾回收器的特性、重点了解CMS(或G1)以及一些重要的参数 内存区域
能说清jvm的内存划分 常见问题 1. 2. 3.
CMS GC回收分为哪几个阶段?分别做了什么事情? CMS有哪些重要参数?
Concurrent Model Failure和ParNew promotion failed什么情况下会发生? 4. 5. 6. 7. 8. 9. 10. 11. 12.
CMS的优缺点? 有做过哪些GC调优?
为什么要划分成年轻代和老年代?
年轻代为什么被划分成eden、survivor区域? 年轻代为什么采用的是复制算法?
老年代为什么采用的是标记清除、标记整理算法 什么情况下使用堆外内存?要注意些什么? 堆外内存如何被回收? jvm内存区域划分是怎样的?
Spring
bean的生命周期、循环依赖问题、spring cloud(如项目中有用过)、AOP的实现、spring事务传播 常见问题 1.
java动态代理和cglib动态代理的区别(经常结合spring一起问所以就放这里了) 2. 3.
spring中bean的生命周期是怎样的?
属性注入和构造器注入哪种会有循环依赖的问题?
Dubbo(或其他Rpc框架)
了解一个常用RPC框架如Dubbo的实现:服务发现、路由、异步调用、限流降级、失败重试 常见问题 1. 2. 3. 4.
Dubbo如何做负载均衡? Dubbo如何做限流降级? Dubbo如何优雅的下线服务? Dubbo如何实现异步调用的?
RocketMq(或其他消息中间件)
了解一个常用消息中间件如RocketMq的实现:如何保证高可用和高吞吐、消息顺序、重复消费、事务消息、延迟消息、死信队列 常见问题 1. 2. 3. 4. 5. 6. 7. 8. 9.
RocketMq如何保证高可用的? RocketMq如何保证高吞吐的? RocketMq的消息是有序的吗?
RocketMq的消息局部顺序是如何保证的? RocketMq事务消息的实现机制?
RocketMq会有重复消费的问题吗?如何解决? RocketMq支持什么级别的延迟消息?如何实现的? RocketMq是推模型还是拉模型? Consumer的负载均衡是怎么样的?
Redis(或其他缓存系统)
redis工作模型、redis持久化、redis过期淘汰机制、redis分布式集群的常见形式、分布式锁、缓存击穿、缓存雪崩、缓存一致性问题 常见问题 1. 2. 3.
redis性能为什么高?
单线程的redis如何利用多核cpu机器? redis的缓存淘汰策略?
4. 5. 6. 7. 8. 9. 10.
redis如何持久化数据? redis有哪几种数据结构? redis集群有哪几种形式?
有海量key和value都比较小的数据,在redis中如何存储才更省内存? 如何保证redis和DB中的数据一致性? 如何解决缓存穿透和缓存雪崩? 如何用redis实现分布式锁?
Mysql
事务隔离级别、锁、索引的数据结构、聚簇索引和非聚簇索引、最左匹配原则、查询优化(explain等命令) 常见问题 1. 2. 3. 4. 5. 6. 7. 8.
Mysql(innondb 下同) 有哪几种事务隔离级别? 不同事务隔离级别分别会加哪些锁?
mysql的行锁、表锁、间隙锁、意向锁分别是做什么的? 说说什么是最左匹配? 如何优化慢查询?
mysql索引为什么用的是b+ tree而不是b tree、红黑树 分库分表如何选择分表键
分库分表的情况下,查询时一般是如何做排序的?