当前位置: 首页 > news >正文

关于中级开发工程师常问的面试题

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等

可以附带说说自己对这些中间件的知识点(也就是熟练度)

注:基本问的最多的就这些,可能也会问初级的知识点。

        先看面试问题,自己在总结答案,主要的是理解

相关文章:

  • 蓝桥杯刷题第二十天
  • 二叉树(数据结构系列9)
  • mybatis-plus的批量新增insertBatchSomeColumn
  • Linux内核IO基础知识与概念
  • Java - 配置中心初体验
  • 面试--每日一经
  • 算法训练营第五十九天|LeetCode647、516
  • 音视频开发—MediaCodec 解码H264/H265码流视频
  • 【python进阶】序列切片还能这么用?切片的强大比你了解的多太多
  • 内网升级“高效安全”利器!统信软件发布私有化更新管理平台
  • 什么是Vue
  • [图像识别]关于cv2库无法安装的故障问题解决,全网最全解决方案!本人亲身测试,参考了stackoverflow、51CTO等博客文章总结而成
  • 菜鸟刷题Day5
  • 22 k8s常用命令
  • 接口的定义和实现
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • 2018一半小结一波
  • Babel配置的不完全指南
  • Fabric架构演变之路
  • Hibernate【inverse和cascade属性】知识要点
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • java8-模拟hadoop
  • jdbc就是这么简单
  • MobX
  • Netty 4.1 源代码学习:线程模型
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • spring-boot List转Page
  • underscore源码剖析之整体架构
  • 成为一名优秀的Developer的书单
  • 爬虫模拟登陆 SegmentFault
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • Spring第一个helloWorld
  • 阿里云重庆大学大数据训练营落地分享
  • # include “ “ 和 # include < >两者的区别
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • #1015 : KMP算法
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • #传输# #传输数据判断#
  • (Note)C++中的继承方式
  • (ros//EnvironmentVariables)ros环境变量
  • (读书笔记)Javascript高级程序设计---ECMAScript基础
  • (附源码)ssm高校实验室 毕业设计 800008
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (十三)Flask之特殊装饰器详解
  • (十三)MipMap
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (转)程序员疫苗:代码注入
  • (自适应手机端)响应式服装服饰外贸企业网站模板
  • *Django中的Ajax 纯js的书写样式1
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .net framework4与其client profile版本的区别
  • .NET 事件模型教程(二)
  • .NET/C# 的字符串暂存池
  • .netcore如何运行环境安装到Linux服务器