面试题-实例

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/10739.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

EPAI手绘建模APP工程图顶部工具栏

7、工程图 图 302 工程图 工程图包括顶部常用工具栏、右侧工程图工具栏、左侧模型列表栏、中间的工程图。 (1) 常用工具栏 ① 删除,选中场景中工程图元素后,删除。可以选择多个工程图元素同时删除。 ② 设置,打开工程图设置页面&#xff0…

Java基础(29)表达式语言(EL)的隐式对象及其作用

表达式语言(Expression Language,简称EL)是JSP 2.0及以上版本中引入的一种简化页面代码编写的语言,它提供了一种在JSP页面中更容易使用JavaBean属性及集合的方式。EL主要用于简化对Java代码的调用,特别是从后端到前端的…

2024 年最新本地、云服务器安装部署 miniconda 环境详细教程(更新中)

Anaconda 概述 Anaconda 是专门为了方便使用 Python 进行数据科学研究而建立的一组软件包,涵盖了数据科学领域常见的 Python 库,并且自带了专门用来解决软件环境依赖问题的 conda 包管理系统。主要是提供了包管理与环境管理的功能,可以很方便…

picoCTF-Web Exploitation-More SQLi

Description Can you find the flag on this website. Additional details will be available after launching your challenge instance. Hints SQLiLite 先随便输入个账号密码登录一下,得到查询SQL,接下来应该对SQL进行某些攻击来绕过密码登录成功 -- …

微信小程序踩坑,skyline模式下,简易双向绑定无效

工具版本 基础库版本 Skline模式 页面json设置 问题描述 skyline模式下,textarea,input标签设置简易双向绑定 model:value是无效的,关闭skyline模式就正常使用了 截图展示 这里只展示了textarea标签,input标签的简易双向绑定也是无效的 总结 我在文档里面是没找到skyline里面不…

Android OpenMAX(八)如何学习OMXNodeInstance

前面一篇文章中我们看到media.codec service创建OMX组件后会把组件传递给一个OMXNodeInstance对象,并且把OMXNodeInstance对象返回到Framework层,Framework通过调用OMXNodeInstance的API来操作OMX组件。从这一篇开始,我们一起学习OMXNodeInstance,在这里我要强调一下,接下…

动态规划----股票买卖问题(详解)

目录 一.买卖股票的最佳时机: 二.买卖股票的最佳时机含冷冻期: 三.买卖股票的最佳时期含⼿续费: 四.买卖股票的最佳时机III: 五.买卖股票的最佳时机IV: 买卖股票的最佳时机问题介绍:动态规划买卖股票的最佳时机是一个经典的…

windows使用Docker-Desktop部署lobe-chat

文章目录 window安装docker-desktop下载和启动lobe-chatAI大语言模型的选择lobe-chat设置大模型连接 window安装docker-desktop docker-desktop下载地址 正常安装应用,然后启动应用,注意启动docker引擎 打开右上角的设置,进入Docker Engine设…

算法学习系列(六十):区间DP

目录 引言区间合并模板一、石子合并二、环形石子合并三、能量项链 引言 关于这个区间 D P DP DP ,其实是有套路和模板的,题型的话也是变化不多,感觉就那几种,只不过有些题会用到高精度或者是要记录方案,所以整体来说…

Unity编辑器如何多开同一个项目?

在联网游戏的开发过程中,多开客户端进行联调是再常见不过的需求。但是Unity并不支持编辑器多开同一个项目,每次都得项目打个包(耗时2分钟以上),然后编辑器开一个进程,exe 再开一个,真的有够XX的。o(╥﹏╥)o没错&#…

Hive 与 SQL 标准和主流 SQL DB 的语法区别

文章目录 1.Hive 简介2.Hive 与 SQL 标准和主流 SQL DB 的语法区别参考文献 1.Hive 简介 Hive是一种基于Hadoop的数据仓库软件,可以将结构化数据文件映射为一张数据库表,并提供了类SQL查询接口,使得用户可以使用SQL类语言来查询数据。Hive可…

7-117 死亡隧道

小毛驴要回家了,凭借着刚从老毛驴处学到的闪烁魔法,小毛驴信心满满地出发了。这一次它来到了另一条死亡隧道口,但是,小毛驴不知道死亡威胁随时存在,因为它所打算穿过的这条死亡隧道即将于T秒时间后坍塌。 已知小毛驴行走的速度是每秒17米,而小毛驴拥有的闪烁法术可以使它…

返回类型后置,一个用途是为了逻辑上的体现?

大家一般都是先关心参数,然后最后再看返回的是什么类型。 在这里把返回类型后置,可能就是一种逻辑上的体现吧 fmt的一个函数。 \fmt\core.h 这个函数的意义,应该就是用变长参数初始化成一个format_arg_store类型的变量,并返回。…

Rust学习笔记(上)

前言 笔记的内容主要参考与《Rust 程序设计语言》,一些也参考了《通过例子学 Rust》和《Rust语言圣经》。 Rust学习笔记分为上中下,其它两个地址在Rust学习笔记(中)和Rust学习笔记(下)。 编译与运行 Ru…

成功解决No module named ‘huggingface_hub.inference._text_generation‘

成功解决No module named huggingface_hub.inference._text_generation 目录 解决问题 解决思路 解决方法 解决问题 No module named huggingface_hub.inferen

python使用yaml文件以及元组样式字符串使用eval的类型转换

编程中,对于可变内容,最好是将其放入配置文件中,经过这段时间的学习,感觉使用yaml文件很方便。我的环境:win10,python3.8.10。 python使用yaml文件,首先要安装库。 pip38 install pyyaml 安装…

AWTK 开源串口屏开发(18) - 用 C 语言自定义命令

AWTK-HMI 内置了不少模型,利用这些模型开发应用程序,不需要编写代码即可实现常见的应用。但是,有时候我们需要自定义一些命令,以实现一些特殊的功能。 本文档介绍如何使用 C 语言自定义命令。 1. 实现 hmi_model_cmd_t 接口 1.1…

实现二叉树的基本操作

博主主页: 码农派大星. 关注博主带你了解更多数据结构知识 1我们先来模拟创建一个二叉树 public class TestBinaryTreee {static class TreeNode{public char val;public TreeNode left;public TreeNode right;public TreeNode(char val) {this.val val;}}public TreeNode …

交叉编译u-boot,qemu启动测试

交叉编译u-boot 1 配置交叉编译工具链: 下载地址 https://releases.linaro.org/components/toolchain/binaries/ ### CROSS-COMPILE export AARCH64_LINUX_GNU_TOOLS/media/wmx/cross_compile_tools/aarch64-linux-gun/gcc-x86_64_aarch64-linux-gnu/bin export …

linux 安装 mangodb 并设置服务开机自启

1、下载 wget http://mosquitto.org/files/source/mosquitto-1.6.8.tar.gz 2、解压 tar -zxvf mosquitto-1.6.8.tar.gz 3、编译安装cd mosquitto-1.6.8 make sudo make install4、在当前目录。进入mosquitto服务文件存放的文件夹 cd service/systemd可以看到3个文件 点击read…