大家好,我是 jonssonyan,最近面试了一些 Java 开发岗,看看外面的行情,看看有没有行情回升的迹象,天天在公司写增删改查套业务也看看最近外面面试都会问哪些问题,主流技术栈有没有变化。
投简历的技巧
- 月底投 hr 冲 kpi 概率比较大(不是说不让投,而是说要有心理准备)
- 投最近活跃的职位(3 天前活跃的基本就不要看了)
- 打招呼用语用自定义的,比如说,我是 xxx,几年经验,会什么,之前是做什么的,我能投简历给你看看么?这样获得回复的几率会大一些
- 岗位描述很宽泛的很可能是为了宣传公司
- 多个招聘软件看看,别只会用 BOSS 直聘
- 网上或者找朋友要一个内推码或许有用
- 面试前一定要刷面试题,不喜欢背也要刷,可以应付大部分面试
- 如果工作经验 3 年以上,项目要侧重准备
高频面试题
分享一些我最近面试遇到的面试题,我面试的是 Java 开发岗,1-5 年工作经验,希望对大家有帮助,也希望大家可以找到自己满意的工作。
user 表只有 id 字段,查询出具有重复的 id
1 | SELECT id, COUNT(id) AS id_count |
动态代理
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+树
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 | public class Singleton { |
悲观锁和乐观锁
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 和有些公司的研发有要求,每月必须面多少人。
以上就是我分享的一些面试过程中的细节,希望对正在找工作的朋友们有帮助。如果你有其他看法欢迎评论区交流。