【面试】一知智能
1.Spring的bean的生命周期,spring boot的生命周期?
理解:
1.实例化bean,就是先创建一个bean,可以根据xml或者@bean注解创建
2.属性赋值阶段,将配置的属性或者依赖注入到bean中,可以通过配置文件或者注解的方式进行实现
3.初始化阶段,可以通过@PostConstuct或者bean的接口来定义初始化方法
4.使用阶段,Bean可以被使用
5.销毁阶段,当应用程序或者容器销毁的时候,调用销毁方法
实例化,属性赋值,初始化,使用,销毁
在 Spring 框架中,Bean 的生命周期包括以下几个阶段:
- 实例化(Instantiation):在这个阶段,Spring 容器会根据配置信息或注解创建一个 Bean 的实例。可以通过构造函数实例化或使用工厂方法创建 Bean。
- 属性赋值(Population):在实例化之后,Spring 容器会将配置的属性值或依赖注入到 Bean 实例中。这可以通过 XML 配置、注解或自动装配等方式完成。
- 初始化(Initialization):在属性赋值完成后,Spring 容器会调用 Bean 的初始化方法,进行一些自定义的初始化逻辑。可以通过实现 InitializingBean 接口或使用 @PostConstruct 注解来定义初始化方法。
- 使用(In Use):在初始化完成后,Bean 可以被应用程序使用。它可以响应应用程序的请求,提供所需的功能。
- 销毁(Destruction):在应用程序关闭或容器销毁时,Spring 容器会调用 Bean 的销毁方法,执行一些清理操作。可以通过实现 DisposableBean 接口或使用 @PreDestroy 注解来定义销毁方法。
2.mysql中的索引都有哪些?你用过哪些索引?怎么样能用索引更快的查询?
答:
1 | -- 创建主键索引 |
索引的原理(二叉树):
索引的类型:
主键索引,主键自动的为主索引(类型Primary key)
1 | create table t1 ( |
唯一索引(UNIQUE)
1 | create table t2( |
普通索引(INDEX)
全文索引 (FULLTEXT)[适用于MyISAM]开发中考虑使用: 全文搜索 Solr 和 ElasticSearch (ES)
1 | -- 删除索引 |
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方法功能相同。
(3)key和value是否允许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:将字符串转换成大写字母