面试经历(四) 时间:2022-11-14 笔试
(培训机构真该洗啊,写完后根本不看你写的笔试,直接给你说送你去培训,技术什么都没有问,直接拿着你的简历画画,画什么实训和培训的不同,其实都是想割韭菜的。)
1、rabbitMQ实现原理?怎么实现的?怎么通信?为什么要用rabbitMQ 而不直接调用?
2、 String、StringBuilder、StringBuffer底层是什么
String是不可变的字符串,它的底层是一个用final修饰的字符数组
String 对象赋值之后就会在字符串常量池中缓存 String
String底层:
底层是char[], 长度固定不变,声明不可变的对象
StringBuffer和StringBuilder底层存储是一个字符数组,继承自AbstractStringBuilder的value属性。
StringBuffer: 底层是固定长度的char[],默认长度是16个,线程安全,在append方法加了synchronized,多线程适用
StringBuilder:底层是固定长度的char[],默认长度是16个,线程不安全,性能高于StringBuffer,单线程适用
3、 谈谈你知道的队列有哪些
java中队列接口是Queue: 基本上,一个队列就是一个先入先出(FIFO)的数据结构
Queue接口与List、Set同一级别,都是继承了Collection接口。LinkedList实现了Deque接口
第一种:ConcurrentLinkedQueue,高性能无阻塞无界队列
第二种:ArrayBlockingQueue,基于数组的阻塞队列,有界队列
第三种:LinkedBlockingQueue,阻塞队列,无届队列 第四种:SynchronousQueue
4、为什么1.8要引入LocalDateTime
LocalDateTime 相对于Date、Calendar更加安全而且api更加丰富,对日期时间的操作更加容易
线程安全的比如,计算功能强大,并且性能更好,代码更简洁。
LocalDate是 处理日期类,表示没有时区的日期,不可变且线程安全的
LocalTime是 处理时间类, 表示没有时区的时间, 不可变且线程安全的
LocalDateTime是处理日期时间类,表示没有时区的日期时间,不可变且线程安全的
5、SpringCloud主要的几个组件,feign组件使用流程
组件
1、Eureka实现服务治理;
2、Ribbon主要提供客户侧的软件负载均衡算法;
3、Hystrix断路器,保护系统,控制故障范围;
4、Zuul,api网关,路由,负载均衡等多种作用;
5、Config配置管理。
feign组件使用流程:
1.引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2.在主启动类上添加注解@EnableFeignClients
3.编写FeignClient接口
6、 Mysql数据库如何优化增加读写速度,索引在什么时候失效,索引的执行顺序,两个引擎的区别
7、 Ioc是什么,di是什么
IOC就是控制反转,是指创建对象的控制权的转移。以前创建对象的主动权和时机是由自己把控的,而现在这种权力转移到Spring容器中,并由容器根据配置文件去创建实例和管理各个实例之间的依赖关系。对象与对象之间松散耦合,也利于功能的复用。DI依赖注入,和控制反转是同一个概念的不同角度的描述,即 应用程序在运行时依赖IoC容器来动态注入对象需要的外部资源。
Spring的IOC有三种注入方式 :构造器注入、setter方法注入、根据注解注入
di是依赖注入指程序运行过程中,如果需要调用另一个对象协助时,无须在代码中创建被调用者,而是依赖于外部的注入。Spring的依赖注入对调用者和被调用者几乎没有任何要求,完全支持对POJO之间依赖关系的管理
8、 Redis支持的几种数据类型,缓存雪崩,缓存穿透
五种: String、List、Set、Zset、Hash。
缓存雪崩: 大量的热点 key 设置了相同的过期时间,导在缓存在同一时刻全部失效,造成瞬时数据库请求量大、压力骤增,引起雪崩,甚至导致数据库被打挂
缓存穿透 : 指查询一个根本不存在的数据,缓存层和持久层都不会命中。(访问一个缓存和数据库都不存在的 key,此时会直接打到数据库上,并且查不到数据,没法写缓存,所以下一次同样会打到数据库上。)
附带:
缓存击穿: 某一个热点 key,在缓存过期的一瞬间,同时有大量的请求打进来,由于此时缓存过期了,所以请求最终都会走到数据库,造成瞬时数据库请求量大、压力骤增,甚至可能打垮数据库。
缓存穿透与击穿的区别
击穿:数据库里“有”数据;
穿透:数据库里“没”数据。