背景介绍
参加了多次面试,总结了一些个人对于面试的见解,希望能给大家以后的面试带来些许帮助。本人平时注重总结一些理论知识,所以遇到毕业的情况也不太慌,也建议大家平时要卷安思危以应对未来的多种可能性的发生。下面介绍一下我在面试阶段遇到的部分面试真题与个人总结。
算法
算法需要长期的准备,个人觉得 leetcode 上刷 200+ 个题目就足以涵盖国内大厂的面试范围了,可以在 leetcode 上去刷热门的前二百个题目。因为大概率面试官也是刷的这些题目。
面试真题
- 三数之和 (经典题 注意结果的去重)
- 回文链表 (链表的题目都不难 热门的几个题目刷通就 ok 了)
- 数组中的第 k 个最大元素 (借助快排思想来做 所以快排当然得熟练)
- 寻找旋转排序数组中的最小值 (标准二分查找的变体)
- 二叉树 (比较热门 遇到过层序遍历、最近公共祖先、最长路径和等题型)
- 复原 ip 地址 (经典回溯题目)
- 动态规划 (这类型题目不会太难 基础的动态规划题型要会 比如背包、打家劫舍、股票买卖等 核心是推敲出状态转移方程)
总结
算法一定要提前准备,临时抱佛脚效率非常低,有跳槽想法的兄弟,可以在日常工作中没事就刷一两个,而且一定要自己思考,不要上来就看答案,如果没有思路,那么可以看下思路解析,然后再去自己动手写,这样也可以锻炼编程能力,对于题目的记忆也会更加深刻。
Java
Java 相关的内容非常的多,对于集合、io、多线程、jvm 相关的问题比较热门。
面试真题
- 除了
clone()还有哪些方式可以对对象进行深拷贝? - java 对象的内存结构?标记字是做什么的?
- 写个单例?为何静态内部类实现的单例可以做到线程安全且可延迟加载?
new HashMap<1000>和new HashMap<10000>在数据都塞满的时候有什么区别?(提示 扩容相关)- java 弱引用和虚引用的区别?
- 垃圾回收时标记存活对象的三色标记法原理,以及在出现漏标、错标情况时是如何解决的?
- jvm 调优你如何做的?现象->排查过程->解决方式->不同解决方案的对比与选择
- 为何引入 JIT 编译?逃逸分析是什么?
- 多线程中的三大问题 java 是如何解决的?
synchronized底层实现原理?释放锁之后如何通知其他线程获取锁?- 讲讲 AQS?
synchronized做了哪些优化?(偏向锁、轻量级锁、自旋锁、锁粗化、锁消除等)LongAdder实现原理?- 动态代理的实现方式有哪些?对比与选择?
总结
这些知识很杂,需要大家平时多积累一下,建议参考官方文档及高质量技术文章,知识面非常广,对我的帮助也很大。
数据库和消息队列
MySQL
面试真题
- 索引 (为何使用 b+ 树而不是使用别的数据结构?索引下推?倒排索引?)
- 事务 (ACID 隔离级别 幻读如何出现的 又是如何解决?)
- 锁 (给一个 sql 问这条 sql 在不同隔离级别下是如何加锁的?)
- mvcc 机制 (实现原理以及 rr 和 rc 隔离级别下实现的区别?)
- redo log, undo log, binlog (会问分别是用来做什么的 有什么共同点 区别?)
- sql 优化 (选择一个适合自己业务的 sql 场景 描述清楚自己如何通过 explain 命令来分析和优化的?)
总结
MySQL 在后端面试中几乎是必问的重点,一定要提前认真准备,像索引、锁、事务等知识点,一定要多复习几遍。
Redis
面试真题
- 底层数据结构有哪些?跳表实现原理?为何不用红黑树?
- Redis 的过期策略?
- Redis 的持久化?


