1.Spring的bean的生命周期,spring boot的生命周期?

理解

1.实例化bean,就是先创建一个bean,可以根据xml或者@bean注解创建

2.属性赋值阶段,将配置的属性或者依赖注入到bean中,可以通过配置文件或者注解的方式进行实现

3.初始化阶段,可以通过@PostConstuct或者bean的接口来定义初始化方法

4.使用阶段,Bean可以被使用

5.销毁阶段,当应用程序或者容器销毁的时候,调用销毁方法


实例化,属性赋值,初始化,使用,销毁

在 Spring 框架中,Bean 的生命周期包括以下几个阶段:

  1. 实例化(Instantiation):在这个阶段,Spring 容器会根据配置信息或注解创建一个 Bean 的实例。可以通过构造函数实例化或使用工厂方法创建 Bean。
  2. 属性赋值(Population):在实例化之后,Spring 容器会将配置的属性值或依赖注入到 Bean 实例中。这可以通过 XML 配置、注解或自动装配等方式完成。
  3. 初始化(Initialization):在属性赋值完成后,Spring 容器会调用 Bean 的初始化方法,进行一些自定义的初始化逻辑。可以通过实现 InitializingBean 接口或使用 @PostConstruct 注解来定义初始化方法。
  4. 使用(In Use):在初始化完成后,Bean 可以被应用程序使用。它可以响应应用程序的请求,提供所需的功能。
  5. 销毁(Destruction):在应用程序关闭或容器销毁时,Spring 容器会调用 Bean 的销毁方法,执行一些清理操作。可以通过实现 DisposableBean 接口或使用 @PreDestroy 注解来定义销毁方法。

2.mysql中的索引都有哪些?你用过哪些索引?怎么样能用索引更快的查询?

答:

1
2
3
4
5
6
-- 创建主键索引
CREATE INDEX empno_index ON emp(empno)
-- 其中empno_index为索引名称
-- 在emp这张表的empno列创建
-- 只对创建索引的列有效

索引的原理(二叉树):

图片
索引的类型:
主键索引,主键自动的为主索引(类型Primary key)

1
2
3
create table t1 (
id int primary key,-- 主键,同时也是索引,称为主键索引
name varchar(32));

唯一索引(UNIQUE)

1
2
3
4
create table t2(
id int unique,-- id是唯一的,同时也是索引,称为unique索引
name varchar(32));
-- 一般是在某列的值不会重复的情况下使用,否则使用普通索引(inedx)

普通索引(INDEX)

全文索引 (FULLTEXT)[适用于MyISAM]开发中考虑使用: 全文搜索 Solr 和 ElasticSearch (ES)

1
2
3
4
-- 删除索引
DROP INDEX id_index ON t25 -- id_index为索引名称,t25为表名
-- 删除主键索引
ALTER TABLE t26 DROP PRIMARY KEY

3.请说一下线程和进程的区别?对于一个操作系统来说怎么实现线程和进程

线程是进程内部,

进程比作工厂

想象一个进程像是一个工厂。每个工厂(进程)拥有它自己的资源:建筑物(内存空间)、电力供应(CPU时间)、原料(程序代码和数据)等。每个工厂独立运作,生产产品(执行程序)。工厂之间互不干扰,它们各自管理自己的资源。如果一个工厂发生故障(进程崩溃),它不会影响到其他工厂的运作。

线程比作工人

在每个工厂内部,有许多工人(线程)在工作。这些工人共享工厂的资源:他们在同一建筑内工作,使用相同的电力供应和原料。但每个工人负责完成特定的任务(执行特定的代码段)。一些工人可能在装配线上工作(执行计算任务),而其他工人可能在包装部门(处理输入/输出任务)。

工人之间可以轻松地互相沟通(线程间通信),因为他们处于同一个工厂内。他们可以直接交谈,交换工具或材料,而不需要通过外部邮递服务(进程间通信需要更复杂的机制)。

如果一个工人遇到问题(线程崩溃),这可能会影响到同一工厂内的其他工人,因为他们共享同样的工作环境。在最坏的情况下,这可能导致整个工厂停工(进程崩溃)。

创建和管理

创建一个新工厂(进程)需要大量的资源和时间,因为你需要建造建筑物,安装设备,招聘员工等。相比之下,雇佣一个新工人(创建一个线程)成本较低,因为工厂的基础设施已经就绪,只需要为新工人提供一些个人工具和工作空间即可。


线程的创建方式

1、继承 Thread 类

通过继承 Thread 类,并重写它的 run 方法,我们就可以创建一个线程。

  • 首先定义一个类来继承 Thread 类,重写 run 方法。
  • 然后创建这个子类对象,并调用 start 方法启动线程。

图片

2、实现 Runnable 接口

通过实现 Runnable ,并实现 run 方法,也可以创建一个线程。

  • 首先定义一个类实现 Runnable 接口,并实现 run 方法。
  • 然后创建 Runnable 实现类对象,并把它作为 target 传入 Thread 的构造函数中
  • 最后调用 start 方法启动线程。

图片

3、实现 Callable 接口,并结合 Future 实现

  • 首先定义一个 Callable 的实现类,并实现 call 方法。call 方法是带返回值的。
  • 然后通过 FutureTask 的构造方法,把这个 Callable 实现类传进去。
  • 把 FutureTask 作为 Thread 类的 target ,创建 Thread 线程对象。
  • 通过 FutureTask 的 get 方法获取线程的执行结果。

图片

4、通过线程池创建线程

此处用 JDK 自带的 Executors 来创建线程池对象。

  • 首先,定一个 Runnable 的实现类,重写 run 方法。
  • 然后创建一个拥有固定线程数的线程池。
  • 最后通过 ExecutorService 对象的 execute 方法传入线程对象。

图片

4.你用过哪些数据库连接池?数据库的连接池是怎样运作的?

图片

使用方法:maven引入druid的外部依赖,然后再yml或者是properties中配置数据库连接即可。可以设置最大连接数量

5.你是如何使用HashMap的?(HashMap与HashTable 的区别)

理解

HashMap是线程不安全的,里面有containsVaule,containsKey两个方法,而且HashMap的key只能有一个为空,且key对应的多个vaule为空。

HashTable的线程是安全的,里面有containsVaule,containsKey,contains三种方法。containsVaule和contains功能相同,适合在多线程并发的情况下使用


(1)线程安全性不同

HashMap是线程不安全的,HashTable是线程安全的,其中的方法大多数是Synchronize的,在多线程并发的情况下,可以直接使用HashTable,但是使用HashMap时必须自己增加同步处理。

(2)是否提供contains方法

HashMap只有containsValue和containsKey方法;HashTable有contains、containsKey和containsValue三个方法,其中contains和containsValue方法功能相同。

(3keyvalue是否允许null

Hashtable中,key和value都不允许出现null值。HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。

6.事务隔离级别

视频说明

脏读:开启两个事务,事务A读到了事务B还没有提交的数据

幻读:事务A的操作是修改了数据表中全部的数据行,与此同时事务B插入了一条新的数据,最后事务A去查看数据表的时候发现有一条数据没被修改,就像产生了幻觉一样

不可重复读:在一个事物里面执行了两次select语句,在此期间没有执行DDL语句,但是前后查看的数据结果却不相同

图片

7、 == 和 equals的区别

== 既可以比较基本数据类型,也可以比较引用数据类型,比较基本数据类型,比较的是具体的值,比较引用数据类型比较是地址值。

equals只能比较引用数据类型,重写之前比较的是引用数据类型的地址值,重写之后,根据重自定义写的规则,比较的是引用数据类型的内容。


理解

==既可以比较基本数据类型也可以比较引用数据类型,基本数据类型比较的是具体的值,引用数据类型比较的是地址值

equals只能比较引用数据类型,比较的是引用数据类型地址的值,重写后有可以根据规则比较引用数据类型的内容

8.String StringBuffer 和 StringBuilder 的区别是什么

理解

StringBuffer对方法加了同步锁,或者对调用方法加了同步锁,线程是安全的
StringBuilder是没有对方法加同步锁,线程是不安全的
大批量数据单线程用StringBuilder
大批量数据多线程用StringBuffer


String、StringBuilder、StringBuffer是不可变的字符串序列,因此该类不可以被继承,也即没有子类。

相同点

String类

图片

StringBuilder类:

图片

StringBuffer类:

图片

不同点:

StringBuilder类中的大多数方法没有加Synchronized关键字修饰。而StringBuffer类中的大多数方法都是加了Synchronized关键字修饰,正因为如此,在多线程操作的时候,StringBuffer会比StringBuilder安全,但是其效率会偏低。

9.Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的?

启动类上面的注解是@SpringBootApplication,它也是 Spring Boot 的核心注解,主要组合包含了以下 3 个注解:
@SpringBootConfiguration:组合了@Configuration 注解,实现配置文件的功能。
@EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项,如关闭数据源 自动配置功能 @ComponentScan:Spring组件扫描。

10.写出Java的四类八种基本数据类

整数 byte short int long

小数(浮点) float double

布尔 boolean

字符 char

11.String 类的常用方法都有那些?

equals:比较字符串
split:分割字符串
subString:截取字符串
length:返回字符串长度
indexOf:返回指定字符的索引
charAt:返回指定索引处的字符
replace:字符串的替换
trim:去除字符串两端的空白
getBytes:返回字符串的byte类型数组
toLowerCase:将字符串转换成小写字母
toUpperCase:将字符串转换成大写字母