面试题-实例

1.什么是线程池?

线程池就是事先将创建好的线程进行整合,当需要使用的时候,直接拿出来进行使用,不用现去创建,可以节约开辟的时间,提高效率。

2.线程池有哪些种类?

在java.util.concurrent.Executors包中提供了许多静态方法。

Executors.newsingleThreadPool  单例线程池

Executors.newFixedThreadPool  定长容量的线程池

Executors.newSechodedThreadPool 执行周期任务的线程池

Executors.newCachedThreadPool 可缓存线程池

3.线程池的工作原理

当首次进行execute提交任务时,才会去创建线程。首先是由核心线程来执行。当核心线程都被使用时,会进入等待队列中进行缓存,当等待队列中满了后,就会由救急线程来进行执行。当前方都满了,就会执行拒绝策略,默认是抛出一个异常。

4.线程池的核心参数

corePoolSize 核心线程数   

maxmumPoolSize 最大线程数   核心+救急

workQure 等待队列                    keepAliveTime  救急线程生存时间

unit 时间单位                              unit   时间单位

threadFactory 线程工厂             workQueue  等待队列

handleExecutor 拒绝策略          ThreadFactory  线程工厂

                                                  handler   拒绝策略

5.springmvc的工作流程

用户发送请求,dispatcherservlet前端控制器进行接收,它属于一个调度中心。调用handlemapping处理器映射器,返回一个handleExecutorchain对象,它里面就是包含了一个controller对象。返回给dispatcherServlet。再次调用handleadptor,处理器适配器,将处理器包装为适配器,他会找到对应的controller进行逻辑执行,返回一个modelandview对象给前端控制器。如果先后端不分离,就会调用viewresover试图解析器,将对象解析为view对象,将mode数据渲染到试图上,然后返回。先后端分离,就可以直接responsebody返回json数据给前端。

6.springmvc常用的注解,spring........注解

@RestController

@Service

@Mapper

@Autowired

@SpringBootApplication

@RequestMapping

@GetMapping

@PostMapping

@PutMapping

@DeleteMapping

@PathVarible

@RequestParam

@Param

@Aspect

@Around .....

@Bean

@Configuration

@Data

@Sl4J

@Component

7.spring中bean的生命周期

0 首先要对bena的基本信息进行封装,bean的全部信息封装为一个beanDifination对象

1 调用构造方法,进行实例化

2 set注入,依赖注入,常用的autowired就是这一步

3 aware结尾的接口是否实现,如果实现就要重新方法

4 beanPostProcossor before 前置处理器

5.是否自定义init方法,是否实现initiatingIiitialingBean接口,是否使用beanConstruct@PostContruct注解

6.beanPostProcossor after前置处理器的后置处理器,此处对bean进行增强,可以产生代理对象。 CGlib代理对象

7.销毁

8.spring中事务是怎么实现的

aop实现,在调用方法前开启事务,对方法前后进行拦截,try catch 一下,执行后,如果抛出运行时异常,进进行回滚,无异常提交。

9.spring中事务失效的场景

1.默认只会处理运行时异常,会对运行时异常进行捕获。如果出现异常自己进行catch处理后,也要抛出运行时异常

2.抛出检索异常检查异常,要想进行回滚,可以设置注解的rebackFor 为 Exception.class

3.方法前要使用public修饰。

10.spring中的bean是线程安全的吗?

不是安全的。如果说bean是无状态的那就是安全的。所谓无状态就是他的成员没有被修改,那么注入这种无状态的bean,就是线程安全的。所以就是说某种程度上来说是安全的。

不安全的时候,如果在bean中定义了可修改的成员变量,可以scope改变bean的模式有singlton改为prototype多例的。或者自己加锁实现。

11.什么事aop,是否使用过?

aop是面向切面编程,把公共代码进行抽离方便复用,且可以不改变原代码逻辑。

使用过,例如使用的事务底层就是aop实现。或者记录操作日志

使用切点表达式+环绕通知,也可以自定义注解切点表达式可以使用路径名或者自定义注解。可以获取到很多参数,例如:入参,类名,方法名,返回值,注解,请求方式,信息等

12.springboot自动配置的原理

我们在启动项目时会实例化bean交给springioc容器进行管理。所以就和启动项很密切,就要说到启动类的注解@SpringbootApplication注解。它封装了3个注解。@SpringBootConfiguration这个注解内部其实就是封装了@Configuration注解,标明这就是一个配置类。@ComponentScan注解就是包扫描,不重写的话,默认就是当前类下及其子包下都会扫描到,扫描哪些@Component注解的类,交给容器来管理。@Enable开头的注解,这个注解往往都和第三方的技术关联性很大。它里面封装了@Import注解,这个注解的参数有三种。.class,配置类,importSeletor接口实现类。在源码中是接口实现类这种。实现类中有个方法selectImports()方法,返回值是String[]数组,他会将一个文件转换为String数组,这个文件包含的就是第三方的依赖的全限定类名。要将这些类交给ioc容器来管理,但不是所有的bean都会被加载,因为有一些conditoinal修饰的,他会根据条件进行装配(环境中是否有class文件、是否有对应的bean、是否有对应的属性和值)。这个文件在mate-inf下的spring.factory文件和spring下有个import结尾的文件。

13.springboot中定时任务。

@Secheduled注解

14.springboot打成的jar包和普通的jar包的区别

打成的jar包是可以java -jar进行运行的。而普通的jar包时可以进行引用的,文件和包名一样。

15.RequestMapping和GetMapping的区别

他们功能很相似,可以说getmapping是requestmapping的特例,getmapping更具有语义化。

16.Springboot中的run方法做什么了?

IOC初始化的操作。

17.spring、springmvc、springboot的区别

spring有两大核心 di依赖注入 ioc控制反转目的:解耦。mvc的特点就是适合快速搭建web项目,利用dispatchservlet,modelandview,viewResolver一些简单的概念,来简化web开发 。springboot的特点是自动装配starter启动项,利用这两项来简化大量配置,快速构建项目,简化开发,简话配置代码,约定大于配置。

18.循环引用(循环依赖)讲解一下?具体?

两个bean相互引用,形成闭环,当然3个也行,1个也行。

绝大多说的循环依赖都可以由三级缓存来解决。

一级缓存:存放生命周期已经走完的bean。单利池

二级缓存:生命周期没有走完的半程bena。

三级缓存:一个bean的工程,可以生产代理对象和正常bean对象。ObjectFactories对象工厂

 一级缓存+二级缓存就可以解决普通对象的循环依赖。

三级的出现,是为了解决代理对象的出现。这三级缓存可以解决大部分循环依赖(主要是bean生命周期中构造一下的循环引用)

19.如何实现的?

场景:A引用B,B引用A。

A首先进行实例化,原始对象A会生成一个ObjectFactories对象放入三级缓存。在实例化的过程中,需要依赖B对象,这时候就会把A放入三级缓存中。接着走B的逻辑,因为此时B不存在,所以B进行实例化,原始B会生成一个ObjectFactories对象放入三级缓存,B又需要依赖A,这时候就会到三级缓存中,由beanFactory生产A对象,此时可以是代理对象,接着把A放入二级缓存中。接着走B的逻辑,将A注入给B,B就可以初始化完成B创建成功,就会把B放入到一级缓存中。接着走A的逻辑,因为B已经初始化完成,所以A就可以直接引用B,来完成初始化,接着把A放入一级缓存中。接着将二级缓存中的B进行删除。

20.构造方法中出现循环引用,怎么办?

但是三级缓存解决不了构造方法中的引用。此时就需要使用@Lazy注解,懒加载,当什么时候用到,什么时候再进行加载。

21.如何定位慢查询?

可以使用mysql自带的explain来查看是否具有进一步的优化空间。 type、key、key_len等等

mysql中开启慢日志查询(一般调试阶段,接口设置为2秒响应)

当然也可以使用运维工具,检测接口的运行时长。

22.sql语句执行很慢,如何分析?

看是否命中索引,索引是否生效。key 和 key_len

看type是否有进一步优化的空间。 是否存在全盘扫描/全索引扫描

通过extra判断是否有回表情况。  如果出现回表,可以添加索引或修改返回字段来修复。其实就是覆盖索引。

索引这有机会再理解一下。

23.什么是索引?

是一种快速检索的数据机构,提高检索效率,采用的是B+树,这种树,层数低路径短,阶数高,是一种矮胖的树

24.底层的数据结构是什么样的?

飞叶子节点存储指针,叶子节点存储数据。而且便于扫库区间扫描,因为叶子节点采用双向链表,可以快速检索。

25.什么是回表查询?

说到回表,就需要直到聚簇索引和非聚簇索引,聚簇索引指他的非叶子节点存储指针数据和索引放在一起,叶子节点存储的是整行的数据。非聚簇索引,索引和数据分开发非叶子节点存储的是整行数据的id。而回表指不能一次查询出结果,需要先进行非聚簇索引查出id,再有id查出聚簇索引的整行数据。

26.什么是聚簇索引?什么是非聚簇索引?

上方已经解释。

27.什么是覆盖索引?

所谓覆盖索引就是指可以不用回表就可以查出的数据,因为返回的数据中在索引中已经全部包含了。

28.索引的创建原则,什么情况使用?

数据量大30万,效果比较明显。

数据量大,查询频繁的表

连接条件,where,order group的字段

如果字符串必须是索引可以采用前缀索引。

区分度高的字段。

也要控制索引的数量,并不是越多越好,维护起来成本比较大。

尽量使用联合索引 

如果字段不为空,可以加非空约束,添加约束。

29.mysql超大分页怎么处理?

采用覆盖索引+子查询。

30.什么情况下,索引失效?

首先违背最左原则。1,12,123,正常的。13只有1会执行,23都不会执行。

索引不能使用函数。

索引模糊查询   只有后%是好使的。

>= 这种范围查询 右边不能使用索引

字符串索引,不加'',造成索引失效。(类型转换异常)

31.事务的特性?

原子性、事务是最小操作单元,要么同时成功同时失败

一致性、

隔离性、不会受别的事务影响

持久性

32.并发事务会带来哪些问题?

脏读、不可重复读、幻读、

33.如何解决这个问题?

读未提交,读已提交、重复度、序列化

改变事务的隔离级别,默认是可重复度。但是解决不了幻读。需枷锁处理。

34.Mybatis的执行流程?

不太会。

1.读取MyBatis配置文件:mybatis-config.xml 加载运行环境和映射关系。

2.构造会话工程sqlSessionFactory,一个项目只有一个,是单例的,一般由spring管理

3.会话工厂创建sqlSession对象,包含了执行sql语句的所有方法。

4.操作数据库的接口,Executor执行器,同时负责查询缓存的维护。

5.Executor接口的执行方法中有一个MappedStatement类型的参数,封装了映射信息

6.输入参数映射   java -> 数据库

7.输出结果映射  数据 -> java

35.git指令 

git init

git clone

git remote add origin 地址

git push --set-upstream master

git checkout -b 分支名

git checkout 分支名

git pull = git fetch + git merge

git push

git push origin master

git status

git-log

git reset --hard commitId

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值