2019年11月底到2019年12月初,我来到上海,找个三周的工作。有Java开发岗和数据挖掘岗,第一周没什么准备,加上看数据挖掘看了三个月,Java面试基本上一败涂地,第二周准备了下,逐渐拿了几家offer。后来有同学想参考我的找工作经历,遂总结如下。本篇主要从Java开发的角度整理。
一、基础篇
1.1 手写算法
基本上一线互联网的面试过程中,都有现场手写算法的过程。所以算法一定要有所准备,免得因为准备不足、算法有而影响面试官对自己的印象。结合三周的算法题目,手写算法整体上可以分为 字符串、排序、查找、链表、树和动态规划这几个方面。比较高频面试题的自然是快速排序,当然有的部分面试官会在快速排序上做个变种,但是基本上思路是不变的。其次,次高频的是链表的考察,比如链表的逆转、判断是否有环等。动态规划方面往往问的是思路。最后,也有面试官会给具体的业务场景,需要面试者抽象出算法进行解决业务问题。
- 判断字符串是否是回文串。
- 找出最大长度的回文串。
- 排序各个算法的时间复杂度,手写快速排序与冒泡排序。
- 链表的逆转。
- 判断单链表是否有环,找出单链表里的环的交叉点。
- 树的遍历、树的高度。
- 贪心算法与动态规划。
1.2 计算机基础(网络&操作系统)
计算机基础方面,也有部分公司的部分面试官会问。比较高频的是计算机网络方面的知识,具体有TCP协议、TCP三次握手、四次挥手。比如,TCP为什么要设计成三次握手。另外,也有面试官考察操作系统里虚拟内存的相关知识。
我印象比较深的是,一个面试官问我TCP的拥塞控制。
- TCP为什么要设计成三次握手?
- HTTP请求是如何访问到你的服务器的资源的,如果有spring框架,还会问如何定位资源的。
1.3 Java基础
Java基础涉及的主要有Java基础类型、 Java集合类、Java多线程、Jvm内存模型与垃圾回收。比较高频的问题如下:
- Java8中concurrentHashMap的put与get操作的具体过程,如何保证线程安全的。
- Java 关键字synchronized的用法及其原理,Java8中有哪些改进(锁膨胀的过程)
- Java原子类型的原理,CAS原理(unsafe包),能否保证线程安全?
- Jvm内存模型,CMS垃圾回收与G1垃圾回收。
1.4 数据库基础
数据库也是面试的重点项。因为各大厂的业务都需要用到数据库。
- 数据库索引:Mysql的索引结构,B+树索引(为何不用B树),簇索引,覆盖索引的过程。什么场景的查询不会命中索引?
- 数据库的事物隔离级别:会找具体的场景考察,不能只知道概念。MVVC的原理。
- 数据库的锁:乐观锁、悲观锁、S锁、X锁等。
1.5 中间件
简历上写了中间件,就会问。而且会问到具体原理与应用场景。所以要慎写!
- 消息中间件(Kafka、Metaq、Notify、Activemq等),找一个用过的需要理解原理。其实,使用都很简单。原理方面,消息中间件如何保证不重复不遗漏。
- RPC原理
- 分库分表中间件
- 限流中间件
二、项目篇
项目上主要会问你负责的项目,我的理解其实还是考察你的沟通能力和解决问题的能力。如果项目比较大,先描述项目整体背景再说你具体负责的部分,不夸大不谦虚。
- 项目的背景&价值,解决了什么问题?
- 项目中的难点,解决方案&改进,有的会问业界其他同类型问题的解决方案。
- 故障的处理。
三、软实力
软件开发过程中其实软实力也是不可或缺的一部分。当然,不是每个面试官都会直接问的。同样一个问题,有的应聘者可以描述清楚有的人并不能。
- 问题发现&处理能力&持续优化能力。
- 方案推进,因为需要团队协作。
- 沟通能力。
写在最后
如果你偶然看到这篇文章,我会劝你积累在平时,业务与技术并重。如果你在找工作,我会告诉你临阵磨枪很重要。
我的心路历程,承受了几次打击,后来利用周末迅速调整状态,逐渐转好。失败的原因有个人也有公司的原因。个人准备不充分,有的公司年底并不打算实际招人。另外,面试过程中面过小厂也面过大厂,遇到过如浴春风的面试官也遇到过高高在上的面试官,过与不过保持平常心,不卑不亢。
加油!未来一定会更好!