关于中级开发工程师常问的面试题
1.springBoot的自动配置
- 主方法的springBootAoolication注解中的EnableAutoConfiguration
- EnableAutoConfiguration注解中的Import导入的AutoConfigurationImportSelector
- AutoConfigurationImportSelector类中的selectImports方法
- selectImports方法通过内部的一些方法最后找到springFactoryLoader类的laodFactoryNames方法
- 然后就记载springBoot项目本身和依赖包中的spring.factories配置文件
- 依次读取文件信息,加载对象到容器中
2.mysql的索引及索引失效
- 索引一共有四种类型,单列索引、唯一索引、主键索引、聚集索引
- 普通索引,最基本的索引类型(一般使用在where,order by,group by之后,通过建立单个字段的索引),没有唯一性索引的限制(可重复索引),使用INDEX关键字进行创建索引
- 唯一索引,不允许数据表中出现两行具有相同索引值,使用UNIQUE关键字进行创建索引
- 主键索引,简称主索引,数据库表中一列或列组合(字段)的值唯一标识表中的每一行。称为表的主键。这个索引要求主键中的每个值都是唯一。尽量使用主键索引
- 聚集索引,也称为聚簇索引。指索引项的排序方式和表中数据记录的排序方式一致。聚集索引并不是一种单独的索引类型,而是一种数据存储方式。因为数据在物理存放时只能有一种排列方式,所以一个表只能有一个聚集索引。除聚集索引以外的索引都是普通索引,即非聚集索引
- 非聚集索引,指索引项的排序方式和表中数据记录的排序方式不一致。一个表中只能有一个聚集索引,但表中的每一列都可以有自己的非聚集索引
- 索引失效
- 查询条件使用or时,其中一个条件本身不是索引,导致另一个索引查询失效
- 查询条件使用like时,模糊查询失效
- 查询条件的数值是字符串时,不带有双引号,索引失效
- 查询条件进行计算时,索引失效
- 查询条件违背最左侧前缀,索引失效
3.线程池的参数及参数的意义、工作方式
- corePoolSize,常驻核心线程数量(先使用核心线程)
- maximumPoolSize,最大线程数量
- KeepAliveTime, TimeUnit unit,线程存活时间和时间单位
- BlockingQueue workQueue,阻塞队列 (当核心线程不够用时放在队列中等待)
- ThreadFactory t,线程工厂(当队列已满时,创建线程,数量就是最大线程数量)
- RejectedExecutionHandler h,拒绝策略(当达到最大线程时,不允许使用线程池)
工作方式
- 在执行execute方法时,线程才会创建
- 先使用核心线程数,超出核心线程处理的数量,将会放入阻塞队列
- 后阻塞队列已满,在来的线程将会在最大线程中进行创建新的线程(最大线程数量=阻塞队列数量+核心线程数量)
- 当不能在创建新的线程时,将会进行拒绝策略
4.JVM的组成、作用及收集器
- 本地方法栈:为虚拟机内Native方法进行服务。
- 虚拟机栈:为虚拟机内的java方法服务,通过存储局部变量表、操作数栈、动态链接、方法出口等信息来支撑和完成方法的执行。这里Java虚拟机有规范,如果线程请求栈深度大于虚拟机允许深度,将抛出StackOverflowException异常;如果虚拟机栈的深度允许自动扩展,但扩展申请不到足够的内存,将抛出OutOfMemoryError异常
- 程序计数器:当前线程所执行字节码的行号指示器(如果正在执行Java方法,记录的是正在执行的虚拟机字节码指令的地址;如果记录native方法,则这个计数器为空),它是唯一一个在虚拟机内没有OutOfMemoryError情况的区域
- 虚拟机堆:唯一目的就是存放对象实列,几乎所有的对象实例都在这里分配内存(但并不是绝对的全部对象)。如果在堆中没有内存进行实例对象分配,且堆也将无法扩展,将抛出OutOfMemoryError的异常
- 方法区:用来存储已被虚拟机加载的类信息、常量、静态变量、JIT即时器编译后的代码数据等。当方法区没有内存可以分配时,将抛出OutOfMemorryError异常。
注:这里只写这些,剩下的看看书《深入理解Java虚拟机》,看到收集器就基本差不多了
5.springBoot相关的注解
这个简单说一下常用的就行,我就不写了
6.SpringCloud微服务使用的框架及简单的介绍一下
这个看每个人用的技术,说说技术在这个微服务中的作用,技术怎么实现,基本就OK了
7.消息队列使用的原理
这个也是按照自己经常用的说就行,没有用过或学过,自己看着来吧
8.如何防止sql注入
- 使用过滤器进行关键字过滤
- 将数据值进行字符华,如果有sql进入,那数据值和sql也是拼在一起,也不能执行
9.线程锁介绍一下
-
synchronized和lock
-
synchronized,隐式,程序自动上锁和解锁;lock,显式,程序手动上锁和解锁
-
synchronized是关键字,Lock是接口
-
synchronized是阻塞式加锁,lock是非阻塞式加锁,支持超时时间的加锁
-
lock比synchronized的效率高
-
-
ReentranReadWriteLock(读写锁)
-
ReentranReadWriteLock是ReadWriteLock的实现类
-
ReadWriteLock和Lock同样是接口,提供了readLock和writeLock两种锁的操作机制,一个是只读的锁,一个是写锁
-
-
可能会说使用场景,你们自己找
10.mybatis的一级缓存和二级缓存(同hibernate)
- 一级缓存,默认开启,作用域是sqlsession,但不同的sqlsession之间是不互通,查询一次就会放在一级缓存当中,在sqlseeion执行commit的操作后,一级缓存数据被清除,防止脏读
- 二级缓存,配置开启,作用域是sqlsessionFactory,同一个sqlsessionFactory下的sqlsession的数据共享,在sqlsession关闭后,一级缓存的数据放到二级缓存中,二级缓存的数据有时间限定
11.java的反射机制
- 反射例子
-
java中的对象有两种类型:编译时类型和运行时类型。
- 编译时类型指在声明对象时所使用的类型
- 运行时类型指为对象赋值时所使用的类型
-
例子:Persion per = new Student();
解析:per的Persion是编译时类型,Student是运行时类型
在编译时不能知道该对象和类的信息,只能通过运行时获取对象和类的信息,而这些信息是通过反射机制获取
-
-
反射过程
- 获取想要操作的类的class对象,class类是反射的核心,可以通过调用类的任意方法
- 调用class对象所对应类中定义的方法,这是反射的使用阶段
- 使用反射API来获取类中的属性和方法信息
- 反射获取的信息和方法
- 获取类中属性、方法、成员变量、属性值、构造方法
- 调用某个对象的getClass()方法、调用某个类的class属性、调用Class类中的forName静态方法,加入类路径参数
12.23种设计模式中常用的设计模式
装饰模式、单例模式、适配模式、工厂模式、命令模式等等
按照自己会的说,在对应的说说这几个的模式的作用及实现
13.spring中用到的设计模式
工厂模式、单例模式、代理模式、观察者模式、装饰模式等
按照自己会的说,在对应的说说这几个的模式的作用及实现
14.分布式事务及分布式锁
- 事务分本地事务和分布式事务
- 本地事务,业务处理在同一台服务器,数据库在同一台服务器
- 分布式事务,事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上,且属于不同的应用,事务要么全部成功,要么全部失败
- 事务的解决办法
- 本地事务,springBoot的Transactional注解,要明白这个注解的使用范围和异常处理
- 分布式事务,使用redis分布式事务锁,zookeeper的分布式事务锁
- 在大场景中,redis的效率比zookeeper的效率高
- 这两个技术怎么实现的分布式锁
- springCloudAlibaba的分布式技术seata(用过和学过的可以说)
注:关于分布式的其他知识,可以自己了解
15.常用的数据结构及应用
数组、队列、链表、栈、树
对应java中的实现说一说,在到实际场景中怎么去实现的案例
16.常用的中间件
Nginx、redis、Elasticsearch、JWT、Docker等
可以附带说说自己对这些中间件的知识点(也就是熟练度)
注:基本问的最多的就这些,可能也会问初级的知识点。
先看面试问题,自己在总结答案,主要的是理解