面试中遇到的高频面试题以及你必须关注面试细节

互联网寒冬?金九银十真的不存在了么?虽说现在行情是差了一些,面试机会少了一些,但是大部分公司还是或多或少的招人,春招秋招都在进行。有人离职就有人入职。所以如果你还没约到面试,不要灰心,多投多面,自然而然面试的感觉也就有了。

大家好,我是 jonssonyan,最近面试了一些 Java 开发岗,看看外面的行情,看看有没有行情回升的迹象,天天在公司写增删改查套业务也看看最近外面面试都会问哪些问题,主流技术栈有没有变化。

投简历的技巧

  1. 月底投 hr 冲 kpi 概率比较大(不是说不让投,而是说要有心理准备)
  2. 投最近活跃的职位(3 天前活跃的基本就不要看了)
  3. 打招呼用语用自定义的,比如说,我是 xxx,几年经验,会什么,之前是做什么的,我能投简历给你看看么?这样获得回复的几率会大一些
  4. 岗位描述很宽泛的很可能是为了宣传公司
  5. 多个招聘软件看看,别只会用 BOSS 直聘
  6. 网上或者找朋友要一个内推码或许有用
  7. 面试前一定要刷面试题,不喜欢背也要刷,可以应付大部分面试
  8. 如果工作经验 3 年以上,项目要侧重准备

高频面试题

分享一些我最近面试遇到的面试题,我面试的是 Java 开发岗,1-5 年工作经验,希望对大家有帮助,也希望大家可以找到自己满意的工作。

user 表只有 id 字段,查询出具有重复的 id

1
2
3
4
SELECT id, COUNT(id) AS id_count
FROM user_table
GROUP BY id
HAVING COUNT(id) > 1;

动态代理

https://segmentfault.com/a/1190000040680716

分布式事务存在的问题

https://pdai.tech/md/arch/arch-z-transection.html

SpringBoot 自动装配原理

https://javaguide.cn/system-design/framework/spring/spring-boot-auto-assembly-principles.html

索引失效的场景

  • 创建了组合索引,但查询条件未准守最左匹配原则
  • 在索引列上进行计算、函数、类型转换等操作
  • 以 % 开头的 LIKE 查询比如 LIKE ‘%abc’
  • 查询条件中使用 OR,且 OR 的前后条件中有一个列没有索引,涉及的索引都不会被使用到
  • IN 的取值范围较大时会导致索引失效,走全表扫描(NOT IN 和 IN 的失效场景相同)
  • 发生隐式转换
  • 查询数据占全表的 90%以上,MySQL 会认为走全文检索会比使用索引更快

索引为什么使用 B+树

https://www.xiaolincoding.com/mysql/index/why_index_chose_bpuls_tree.html#%E4%B8%BA%E4%BB%80%E4%B9%88-mysql-%E9%87%87%E7%94%A8-b-%E6%A0%91%E4%BD%9C%E4%B8%BA%E7%B4%A2%E5%BC%95

Java 线程池参数

  • corePoolSize: 任务队列未达到队列容量时,最大可以同时运行的线程数量。
  • maximumPoolSize: 任务队列中存放的任务达到队列容量的时候,当前可以同时运行的线程数量变为最大线程数。
  • workQueue: 新任务来的时候会先判断当前运行的线程数量是否达到核心线程数,如果达到的话,新任务就会被存放在队列中。
  • keepAliveTime: 线程池中的线程数量大于 corePoolSize 的时候,如果这时没有新的任务提交,多余的空闲线程不会立即销毁,而是会等待,直到等待的时间超过了 keepAliveTime 才会被回收销毁,线程池回收线程时,会对核心线程和非核心线程一视同仁,直到线程池中线程的数量等于 corePoolSize ,回收过程才会停止。
  • unit: keepAliveTime 参数的时间单位。
  • threadFactory: executor 创建新线程的时候会用到。
  • handler: 饱和策略。

Redis 为什么快?

  • Redis 基于内存,内存的访问速度是磁盘的上千倍。
  • Redis 基于 Reactor 模式设计开发了一套高效的事件处理模型,主要是单线程事件循环和 IO 多路复用(Redis 线程模式后面会详细介绍到)
  • Redis 内置了多种优化过后的数据类型/结构实现,性能非常高。

Redis IO 多路复用

https://xie.infoq.cn/article/b3816e9fe3ac77684b4f29348

如何解决 OOM

https://juejin.cn/post/7205141492264976445

HashMap 中的红黑树

https://javaguide.cn/java/collection/hashmap-source-code.html

如何应对反爬虫

  • 控制请求频率
  • 使用 IP 代理池
  • 使用自动化测试框架

Mybatis $ 和#区别

#{}方式能够很大程度防止 sql 注入,${}方式无法防止 Sql 注入

Mybatis 一级二级缓存

https://tech.meituan.com/2018/01/19/mybatis-cache.html

线程安全的单例模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Singleton {

private volatile static Singleton uniqueInstance;

private Singleton() {
}

public static Singleton getUniqueInstance() {
//先判断对象是否已经实例过,没有实例化过才进入加锁代码
if (uniqueInstance == null) {
//类对象加锁
synchronized (Singleton.class) {
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
}
}
return uniqueInstance;
}
}

悲观锁和乐观锁

https://javaguide.cn/java/concurrent/optimistic-lock-and-pessimistic-lock.html

Spring 事务隔离级别

  • TransactionDefinition.ISOLATION_DEFAULT: 使用后端数据库默认的隔离级别,MySQL 默认采用的 REPEATABLE_READ 隔离级别 Oracle 默认采用的 READ_COMMITTED 隔离级别。
  • TransactionDefinition.ISOLATION_READ_UNCOMMITTED: 最低的隔离级别,使用这个隔离级别很少,因为它允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。
  • TransactionDefinition.ISOLATION_READ_COMMITTED: 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。
  • TransactionDefinition.ISOLATION_REPEATABLE_READ: 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。
  • TransactionDefinition.ISOLATION_SERIALIZABLE: 最高的隔离级别,完全服从 ACID 的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。但是这将严重影响程序的性能。通常情况下也不会用到该级别。

项目中有很多 if else 如何优化

https://juejin.cn/post/6844904083665453063

分布式 id 生成有哪些方式?

https://javaguide.cn/distributed-system/distributed-id.html

分布式 id 如何保证唯一?

https://javaguide.cn/distributed-system/distributed-id-design.html

一条 SQL 语句的执行过程

  • 连接器: 身份认证和权限相关(登录 MySQL 的时候)。
  • 查询缓存: 执行查询语句的时候,会先查询缓存(MySQL 8.0 版本后移除,因为这个功能不太实用)。
  • 分析器: 没有命中缓存的话,SQL 语句就会经过分析器,分析器说白了就是要先看你的 SQL 语句要干嘛,再检查你的 SQL 语句语法是否正确。
  • 优化器: 按照 MySQL 认为最优的方案去执行。执行器: 执行语句,然后从存储引擎返回数据

线程池的执行过程

  • 如果当前运行的线程数小于核心线程数,那么就会新建一个线程来执行任务。
  • 如果当前运行的线程数等于或大于核心线程数,但是小于最大线程数,那么就把该任务放入到任务队列里等待执行。
  • 如果向任务队列投放任务失败(任务队列已经满了),但是当前运行的线程数是小于最大线程数的,就新建一个线程来执行任务。
  • 如果当前运行的线程数已经等同于最大线程数了,新建线程将会使当前运行的线程超出最大线程数,那么当前任务会被拒绝,饱和策略会调用 RejectedExecutionHandler.rejectedExecution()方法。

Spring 中 Bean 的生命周期

Java 中锁升级的过程

https://segmentfault.com/a/1190000022904663

synchronized 关键字的使用方式

  • synchronized 关键字加到 static 静态方法和 synchronized(class) 代码块上都是是给 Class 类上锁
  • synchronized 关键字加到实例方法上是给对象实例上锁
  • 尽量不要使用 synchronized(String a) 因为 JVM 中,字符串常量池具有缓存功能

Java 内存模型

https://javaguide.cn/java/concurrent/jmm.html

Redis 中缓存击穿、雪崩、穿透,以及对应的解决方案

https://pdai.tech/md/db/nosql-redis/db-redis-x-cache.html

限流算法有哪些

https://javaguide.cn/high-availability/limit-request.html

Spring AOP 应用场景

https://juejin.cn/post/7174708698504233017

分布式锁

https://pdai.tech/md/arch/arch-z-lock.html

分布式中的 CAP 理论

CAP 也就是 Consistency(一致性)、Availability(可用性)、Partition Tolerance(分区容错性) 这三个单词首字母组合。

https://baike.baidu.com/item/CAP%E5%8E%9F%E5%88%99/5712863

面试过程中的细节

面试多了以后你就会发现面试过程都是千篇一律,我这里总结了一些面试过程中大家容易忽略的一些细节,以及遇到一些突发情况该如何面对,希望对大家有帮助,也都希望大家早日找到满意的工作。

细节一:面试的时候让你填一些特别详细的个人信息

有些公司会这样做,甚至有的让你填身份证号码、家庭地址、父母信息。遇到填个人信息的公司,不要写的特别详细,不能太实诚(特别是刚毕业单纯的大学生),比如地址就填到 xxx 市 xxx 区就可以了,电话号码都写自己的或者朋友的,拿到 offer 之后如果需要再提供。毕竟都不一定能面过,简历上关键信息都已经写了,要有保护个人隐私的意识。

细节二:你有什么要问我的?

这是面试结束的时候几乎所有的面试官都会问的问题,说明你的面试以及快结束了,这里有几个通用的提问,可以通过这些提问大致了解到公司的规模、研发能力、能否学到技术、以后会不会加班。

  • 目前公司研发团队有多少人?
  • 面试的岗位负责项目是什么?技术栈是什么?
  • 面试的岗位所在的部门/组人员构成是什么样的?

细节三:之后 hr 会和你联系

言外之意是你挂了,找下一家吧。 如果面试通过会安排下一个人面试而不是让你回去等通知。

细节四:关于面试流程

简历筛选过后,会有 hr 和你约面试时间,之后的流程因公司而异。

  • 大公司一般是:hr 面->笔试/机试->同事面->直系领导面->hrbp 面->老板面->拿到 offer

hr 主要是确认简历的真实性,比如本科是不是统招,为什么从上家离职等等,如实回答就行,最后约面试的形式(线上还是线下)和时间地点。笔试一般题型是选择题+简答题+算法题。同事面一般是八股文。 直系领导是你入职之后在他下面做事的,这一面特别重要,直接影响你是否能通过面试,这一面主要是少量八股文和考察你的项目。hrbp 主要是聊聊生活,平时的兴趣爱好,以及公司福利和最终给你的薪资,还有确认入职时间。老板主要是画饼和问一些你的职业规划,一般只要你的直系领导觉得你没问题多数就代表通过了。最后就是等 offer 了。因为流程比较长,如果线下面试如果一轮过了就直接下一轮,半天全部面完也是有可能的,如果是线上面试可能要单独约时间流程会长一些。

  • 中型公司一般是: hr 面->直系领导面->技术总监面->hrbp 面->拿到 offer

hr 同样是为了确认简历的真实性,直系领导面有的也叫主管面,考察八股文和项目,技术总监(老板)给你定职级和薪资,同样也是问技术,另外画饼是必不可少的。hrbp 和你聊公司福利,几号能入职之类的,他会根据前面的面试效果给你定薪资。有时候 hrbp 也会压你薪资。

  • 小公司一般是:hr 面->直系领导面->拿到 offer

小公司就很简单了,1-2 轮面试就结束,直系领导可能就是老板,直接决定面试结果和薪资。

细节五:今日回复 100+/近三天活跃

BOSS 直聘上面有些 hr 回复是今日 100+,这个就要当心了,可能是为了收简历的,换位思考一下,如果说你是 hr 简历 100+根本不需要那么多人。一般拿到面试机会的概率不大,要有心理准备。

细节六:面试过程中只字不提你想要的薪资

多半面试没过,面试官连问你要多少薪资的欲望都没有。会在最后是让你回去等通知还是等下一轮面试给出答案。

细节七:岗位 jd 上面写的比较宽泛

多半是宣传公司的。一般拿到面试机会的概率不大,要有心理准备。

细节八:岗位薪资比较高,但是技术方面描述熟练度关键词都是了解

这些多半是 hr 想让更多的人投简历。然而面试的时候问的可能是底层,要好好准备。

细节九:月底面试

面试就是随便问问,不会问很细,时间一般在 20 分钟以内,可能是冲 kpi,hr 和有些公司的研发有要求,每月必须面多少人。

以上就是我分享的一些面试过程中的细节,希望对正在找工作的朋友们有帮助。如果你有其他看法欢迎评论区交流。