2020年初 面试总结

毕业到今年已经快四年了,之前的每份工作基本都是一年多一跳,很频繁,换工作基本就是由着性子来,基本没考虑太多,拿到一个 offer 就不想再面试了,十分草率。这次跳槽的想法主要也是想找一个自己喜欢的公司,好好积累一下经验,刷刷简历,沉淀几年。

从一月份到现在,我陆陆续续面试了头条,阿里,Thoughtworks,ebay,shopee,京东,美团,多点 Dmall,企鹅杏仁,喜马拉雅,虎扑,货拉拉,小红书以及一些不太知名的小公司,面试城市涉及成都,重庆,深圳以及上海。其中到 HR 面的有 thoughtworks,美团,多点 Dmall,企鹅杏仁,喜马拉雅,虎扑,货拉拉等。

我在这里简单整理一下各个知识点在面试大概被问了哪几个方面的问题。

自我介绍

疫情期间,基本全部都是远程视频面试,一上来肯定就是自我介绍了,我主要分为以下几点展开介绍。

  1. 毕业学校
  2. 工作经历
  3. 项目经历
  4. 兴趣爱好
  5. 主要技术栈

根据自我介绍,面试官可能会挑说的她比较感兴趣的内容进行提问,当然很多时候,他们会按照自己的节奏来,在这个阶段,大概会针对你的职业生涯,工作内容,离职原因进行提问。

  • 为什么想要离职?
  • 你的职业规划是什么?未来三到五年,你对自己有什么期望?
  • 平时喜欢看什么书?(吴军博士救我老命,我基本每次都说的《数学之美》,一来这本书确实写的不错,二来里面都是一些方法论相关的内容,很有趣,不容易说错。)
  • 最近在学什么新技术?(针对这个问题,我可能会说自己目前正在做的一些开源项目,自己搞的小轮子,主要用了什么新东西。)
  • 怎么看待加班的情况?(加班使我快乐)
  • 怎么处理同事之间的意见不统一的问题?
  • 最有挑战的一个项目是什么?你怎么解决的?(基本每次都被问到这个问题,一般来说,只要十分熟悉自己做的项目的每一个细节,这个问题应该不难。主要是自己的表达一定要恰当)

后端常规技术问题

Java 基础

  • Object 有哪些方法?能说多少说多少。
  • HashCode 和 Equals 有什么关系?
  • Java8 lambda 表达式的原理是什么?
  • 了解泛型吗?泛型的 extends 和 super 的适用场景能不能举几个例子?
  • 泛型是怎么做到向低版本 jdk 兼容的?
  • 了解 java 的协变和逆变吗?
  • String 对象可变吗?怎么才能修改 String 对象(反射…)

这部分内容,说实在的,没什么意义,有个面试官问到协变和逆变的时候,我人都傻了。

集合

这部分内容,我主要关注了,JUC 包里面常用的一些集合类的实现原理。

  • JDK1.7 到 1.8,concurrentHashMap 主要有哪些变化?
  • HashMap 为了减少 Hash 冲突,做了些什么?
  • HashMap 的数组长度为什么是 2 的 N 次方?
  • 为什么 HashMap 要用红黑树而不是 AVL 树?
  • 以及一些比较常规的,例如 ArrayList、linkedlist 的实现原理啥的。

当然面试过程中主要还是通过让你讲具体的原理,然后一次展开,像 hashmap 和 chm 我觉得多看几次源码,记下笔记,应该就能搞定了。

JVM

这一块的内容一般还是问的比较多吧,周志明老师的《深入理解 Java 虚拟机》可以多刷两遍。主要还是从内存模型到垃圾回收,多点几遍书,记笔记,应该没有什么问题。

  • JVM 运行时内存区域划分是什么?
  • 内存泄漏和内存溢出有什么关系和区别?
  • 讲讲类加载器、双亲委派模型,如何破坏双亲委派?
  • 说说类加载的过程?
  • 强引用、软引用、弱引用、虚引用是什么?
  • Java 内存模型 JMM?
  • 常用的几种垃圾回收算法?
  • 你知道哪些垃圾回收器?
  • 了解逃逸分析技术吗?
  • 标记清除和标记整理算法的理解以及优缺点?
  • eden survivor 区的比例,为什么是这个比例,eden survivor 的工作过程?
  • JVM 如何判断一个对象是否该被 GC,可以视为 root 的都有哪几种类型?
  • Java 是否可以 GC 直接内存?
  • 常用的 JVM 调优参数了解吗?
  • 你一般怎么分析 dump 文件?
  • Java 有没有主动触发 GC 的方式(没有)。
  • JVM 对 synchronized 锁优化有哪些?
  • 说说锁升级过程?

多线程与并发

常规面试问题,大厂一般不怎么会问这些题目。

  • 线程安全的 list 有哪些?
  • 说说 threadlocal 的原理以及应用场景?
  • threadlocal 为什么要用 private static 修饰?
  • synchronized 实现原理?
  • AQS 实现原理?(主要把 state 和同步队列的问题讲清楚)
  • volatile 原理?
  • volatile 怎么实现内存屏障的?
  • 线程池的底层原理是什么?
  • Java 中死锁怎么产生?

计算机网络

感觉我很少被问到关于这方面的问题。

  • 一个请求发出去,到页面加载完成,详细说一下这个过程?
  • Http 和 Https 的区别?Http 协议头部是什么内容?
  • TCP 和 UDP 的区别?UDP 主要用于哪些场景?
  • TCP 的拥塞控制怎么实现的?
  • 粘包问题和拆包问题怎么解决?
  • 三次握手中,可以携带数据吗?
  • 四次挥手?为什么需要四次挥手?

框架相关

主要还是围绕 java 相关的几个框架,Spring 全家桶,Dubbo,Netty,MyBatis,另外我简历中提到了 Python,问了一些 Python 相关的框架,像 pandas 之类的。

  • Spring 中使用了哪些设计模式?
  • SpringBoot 的启动过程讲一下?
  • SpringBoot 的 Starter 是怎么实现的?
  • MyBatis 的 Mapper 的实现原理了解吗?
  • Dubbo 的泛化调用用过吗?讲一下
  • Dubbo 的常用组件,说一下
  • Dubbo 应用在 Docker 中怎么暴露自己的网络?
  • 主要用 Pandas 来处理什么样的数据?有做过同类框架的性能对比吗?

分布式以及中间件

这部分内容,主要还是看博客和自己平时的积累吧,像 Raft 算法,Paxos 算法,只能硬啃。看论文解析,像 Raft 还稍微好一点,Paxos 确实跟天书没什么区别了。

  • 知道 CAP 吗?为什么没办法同时实现 CAP?
  • 知道 BASE 吗?
  • Raft 算法和 Paxos 算法,说说自己的理解?
  • 说一说 zookeeper 是如何避免脑裂问题的?
  • zookeeper 的 ZAB 协议,主要解决了什么问题,承担了什么职责?
  • zookeeper 是 AP 还是 CP?
  • 为什么 zookeeper 不适合来做注册中心?
  • 分布式锁的实现,Redis、zookeeper 都讲讲
  • 分布式锁如何处理惊群效应?
  • Redis cluster 是如何进行收缩和扩容的?
  • Kafka 如何实现全局有序消费?
  • Kafka 的副本选举机制?
  • 怎么实现 Exactly-Once?(玄学问题。。)
  • 你们系统消息的幂等性是怎么做的?
  • 了解哪些限流算法?说说自己的理解
  • 使用过哪些分布式事务框架

设计类问题

这个就比较宽泛了,主要还是看面试官的喜好,不过一般还是通过简历上的内容逐渐展开。以下这些问题,基本都是这一波面试中遇到的。

  • 如何设计一个分布式唯一 ID 发号器?
  • 如何设计订单系统的分库分表?
  • 组织结构类的数据如何存储,如果扩展?
  • 如何设计一个注册中心?
  • 分布式调度框架的设计,有什么思路?
  • 你现在的系统并发量加大一千倍,你会如何调整?
  • 设计一个抢红包系统?
  • 商品秒杀,如何设计?
  • 分布式 session 如何设计?
  • 了解单点登录吗,如何设计

数据库

  • 数据仓库与 mysql 区别?hive 和 mysql 有什么区别?spark 和 hadoop 区别?,怎么解决?
  • acid 含义?事务隔离级别?幻读怎么解决的?
  • 用过 mysql 的锁么?有哪些锁?
  • MyISAM、InnoDB 区别?为什么不用 MyISAM?
  • mvcc 原理?多版本数据存放在哪?
  • MVCC 如何实现 RR,RC?
  • redo log,undo log,binlog 之间的关系是什么?
  • innodb 的索引结构是什么?什么是聚簇索引?
  • b+ 树与 b 树的区别?
  • b+ 树与二叉树区别,优点?为什么不用红黑树?
  • 多列索引的结构?
  • 字符串类型和数字类型索引的效率?数据类型隐式转换?
  • 主键与普通索引的联系?存储上的区别?
  • full join 是什么意思?
  • 如何优化慢 SQL?(这个感觉被问的最多了)

大数据相关

可能我的简历有这部分内容,所以有的面试官会问一下,问到稍微复杂点,我直接说不会。。

  • Canal 的高可用是怎么做的?
  • HDFS 的数据倾斜,如何处理?
  • Hbase 的 key 你们是怎么设计的?
  • 如何处理 Kafka 集群的消息背压?
  • 有了解过 Flink 吗?
  • HDFS、Hadoop,Hbase,Hive 的关系,简单说一下

算法题

额、、我这一波,基本没遇到特别难的算法题,运气比较好了。

  • 原地翻转链表
  • Top K
  • BFS、DFS
  • 手写堆排序
  • 无序数组查找指定元素
  • 二叉搜索树,range 查找
  • 找出一个字符串中最长的回文字符
  • 斐列波切数列
  • 二分查找开平方
  • 说说常用排序算法的时间复杂度和稳定性

我有啥想问的?

  • 团队技术栈?人数?
  • 入职后我的工作内容?
  • 部门定位是什么?
  • 目前在做什么业务?

HR 面

这一面最痛苦,我根本不会谈薪资,HR 说啥就是啥。我现在在重庆,Base 太低,聊不动,头皮发麻。略过了。。。

总结

以上这些内容基本上算是 Java 后端常规面试题了,当然这些只是我印象比较深刻的一些题目了,并不是全部内容。

现在越来越多的公司都是固定的面试套路,按照面试题你问我答。我认为这种考察机制有点病态了,我还是比较喜欢和面试官讨论设计类的问题,而不是「HashMap 是如何进行扩容的」这种问题。我觉得设计类的问题,才能发掘并感受出一个人的知识积累程度,以及他的表达能力,还有设计能力。

话虽如此,为了迎合大多数公司的面试口味,以及逐渐内卷的后端市场。还是整理一下这些基础题,就当学习了。

最后,还是展望一下新的工作生活吧,把买的书都给看完,争取二刷,希望自己接下来能够更进一步,加油!