面试题
面试题
01- 线程又几种创建方式和区别
- 继承 Thread 类
- 实现 Runnable 接口
- 实现 Callable 接口,并结合 Future 实现
- 通过线程池创建线程
02-你能说下synchronized和lock的区别吗
03-set和list的区别
List特点:元素有放入顺序,元素可重复
Set特点:元素无放入顺序,元素不可重复,重复元素会覆盖掉,(元素虽然无放入顺序,但是元素在set中的位置是有该元素的HashCode决定的,其位置其实是固定的,加入Set 的Object必须定义equals()方法 ,另外list支持for循环,也就是通过下标来遍历,也可以用迭代器,但是set只能用迭代,因为他无序,无法用下标来取得想要的值。)
3.Set和List对比:
Set:检索元素效率低下,删除和插入效率高,插入和删除不会引起元素位置改变。
List:和数组类似,List可以动态增长,查找元素效率高,插入删除元素效率低,因为会引起其他元素位置改变。
04-哪些情况索引失效
- 某个表中,有两列(id和c_id)都建了单独索引,下面这种查询条件不会走索引
- 存在NULL值条件
- 反过来当查询条件为非时,索引定位就困难了,执行计划此时可能更倾向于全表扫描,这类的查询条件有:<>、NOT、in、not exists
- 当使用模糊搜索时,like 前置通配符 %
- 条件上包括函数
- 数据类型的转换
05-post请求和get请求的区别
本质没有区别
1.get请求一般是去取获取数据(其实也可以提交,但常见的是获取数据);
post请求一般是去提交数据。
2.get因为参数会放在url中,所以隐私性,安全性较差,请求的数据长度是有限制的,
不同的浏览器和服务器不同,一般限制在 2~8K 之间,更加常见的是 1k 以内;
post请求是没有的长度限制,请求数据是放在body中;
3.get请求刷新服务器或者回退没有影响,post请求回退时会重新提交数据请求。
4.get请求可以被缓存,post请求不会被缓存。
5.get请求会被保存在浏览器历史记录当中,post不会。get请求可以被收藏为书签,因为参数就是url中,但post不能。它的参数不在url中。
6.get请求只能进行url编码(appliacation-x-www-form-urlencoded),post请求支持多种(multipart/form-data等)。
深入理解
1…GET 和 POST都是http请求方式, 底层都是 TCP/IP协议;通常GET 产生一个 TCP 数据包;POST 产生两个 TCP 数据包(但firefox是发送一个数据包),
2.对于 GET 方式的请求,浏览器会把 http header 和 data 一并发送出去,服务器响应 200
(返回数据)表示成功;
而对于 POST,浏览器先发送 header,服务器响应 100, 浏览器再继续发送 data,服
务器响应 200 (返回数据)。
06-缓存穿透怎么解决
穿透原理:
- 访问一个不存在的Key
- 缓存中没有数据
- 数据请求太多
解决:
- 规范key的命名,并且统一缓存查询和写入的入口。这样,在入口处,对key的规范进行检测。–这样保存恶意的key被拦截
- web服务器启动时,提前将有可能被频繁并发访问的数据写入缓存。—这样就规避大量的请求在第3步出现排队阻塞
- Synchronized双重检测机制,这时我们就需要使用同步(Synchronized)机制,在同步代码块前查询一下缓存是否存在对应的key,然后同步代码块里面再次查询缓存里是否有要查询的key。 这样“双重检测”的目的,还是避免并发场景下导致的没有意义的数据库的访问
- 限流加锁
07-redis持久化有几种方式区别
AOF:记录服务器每次写的操作,当服务器重启时会执行命令来恢复原来的数据(文件存储方式)
优点:
- 使用AOF 会让Redis数据更加耐久
- 数据同步快,不容易丢失
- AOF文件是一个只进行追加的日志文件
- redis 可以在 AOF 文件体积变得过大时,自动地在后台对 AOF 进行重写
- AOF 文件有序地保存了对数据库执行的所有写入操作
缺点:
- AOF体积大
- AOF速度低
RDB:在指定的时间间隔对数据进行快照存储(快照存储方式)
优点:
- 适用数据集备份
- 方便传输
- 最大化redis性能
- 恢复大数据集更快
缺点:
- 容易丢失数据
- 耗时效率低
08-sql执行计划怎么看
执行计划(execution plan,也叫查询计划或者解释计划)是数据库执行 SQL 语句的具体步骤
EXPLAIN关键字
接下来,我们要做的就是理解执行计划中这些字段的含义。下表列出了 MySQL 执行计划中的各个字段的作用:
列名 作用
id 语句中 SELECT 的序号。如果是 UNION 操作的结果,显示为 NULL;此时 table 列显示为 <unionM,N>。
select_type SELECT 的类型,包括:
- SIMPLE,不涉及 UNION 或者子查询的简单查询;
- PRIMARY,最外层 SELECT;
- UNION,UNION 中第二个或之后的 SELECT;
- DEPENDENT UNION,UNION 中第二个或之后的 SELECT,该 SELECT 依赖于外部查询;
- UNION RESULT,UNION 操作的结果;
- SUBQUERY,子查询中的第一个 SELECT;
- DEPENDENT SUBQUERY,子查询中的第一个 SELECT,该 SELECT 依赖于外部查询;
- DERIVED,派生表,即 FROM 中的子查询;
- DEPENDENT DERIVED,依赖于其他表的派生表;
- MATERIALIZED,物化子查询;
- UNCACHEABLE SUBQUERY,无法缓存结果的子查询,对于外部表中的每一行都需要重新查询;
- UNION 中第二个或之后的 SELECT,该 UNION属于 UNCACHEABLE SUBQUERY。
table 数据行的来源表,也有可能是以下值之一: - <unionM,N>,id 为 M 和 N 的 SELECT 并集运算的结果;
- ,id 为 N 的派生表的结果;
- ,id 为 N 的物化子查询的结果。
partitions 对于分区表而言,表示数据行所在的分区;普通表显示为 NULL。
type 连接类型或者访问类型,性能从好到差依次为: - system,表中只有一行数据,这是 const 类型的特殊情况;
- const,最多返回一条匹配的数据,在查询的最开始读取;
- eq_ref,对于前面的每一行,从该表中读取一行数据;
- ref,对于前面的每一行,从该表中读取匹配索引值的所有数据行;
- fulltext,通过 FULLTEXT 索引查找数据;
- ref_or_null,与 ref 类似,额外加上 NULL 值查找;
- index_merge,使用索引合并优化技术,此时 key 列显示使用的所有索引;
- unique_subquery,替代以下情况时的 eq_ref:value IN (SELECT primary_key FROM single_table WHERE some_expr);
- index_subquery,与 unique_subquery 类似,用于子查询中的非唯一索引:value IN (SELECT key_column FROM single_table WHERE some_expr);
- range,使用索引查找范围值;
- index,与 ALL 类型相同,只不过扫描的是索引;
- ALL,全表扫描,通常表示存在性能问题。
possible_keys 可能用到的索引,实际上不一定使用。
key 实际使用的索引。
key_len 实际使用的索引的长度。
ref 用于和 key 中的索引进行比较的字段或者常量,从而判断是否返回数据行。
rows 执行查询需要检查的行数,对于 InnoDB 是一个估计值。
filtered 根据查询条件过滤之后行数百分比,rows × filtered 表示进入下一步处理的行数。
Extra 包含了额外的信息。例如 Using temporary 表示使用了临时表,Using filesort 表示需要额外的排序操作等。
09-openfeign解决什么问题?远程方法调用有什么要求?
10-gateway网关过滤器 配置
01- 多线程有哪几种状态?
- New:初始状态,线程被创建,没有调用start()
- Runnable:运行状态,Java线程把操作系统中的就绪和运行两种状态统一称为“运行中”
- Blocked:阻塞,线程进入等待状态,线程因为某种原因,放弃了CPU的使用权
阻塞的几种情况:
A. 等待阻塞:运行的线程执行了wait(),JVM会把当前线程放入等待队列
B. 同步阻塞:运行的线程在获取对象的同步锁时,如果该同步锁被其他线程占用了,JVM会把当前线程放入锁池中
C. 其他阻塞:运行的线程执行sleep(),join()或者发出IO请求时,JVM会把当前线程设置为阻塞状态,当sleep()执行完,join()线程终止,IO处理完毕线程再次恢复 - Waiting:等待状态
- timed_waiting:超时等待状态,超时以后自动返回
- terminated:终止状态,当前线程执行完毕
02-线程池有哪些参数?
线程池的构造函数有7个参数,分别是corePoolSize、maximumPoolSize、keepAliveTime、unit、workQueue、threadFactory、handler
- corePoolSize 线程池核心线程大小
- maximumPoolSize 线程池最大线程数量
- keepAliveTime 空闲线程存活时间
- unit 空闲线程存活时间单位
- workQueue 工作队列
- ArrayBlockingQueue
- LinkedBlockingQuene
- SynchronousQuene
- PriorityBlockingQueue
- threadFactory 线程工厂
- handler 拒绝策略
03-hashMap的put方法实现原理
HashMap在put方法中,它使用hashCode()和equals()方法。当我们通过传递key-value对调用put方法的时候,HashMap使用Key hashCode()和哈希算法来找出存储key-value对的索引。如果索引处为空,则直接插入到对应的数组中,否则,判断是否是红黑树,若是,则红黑树插入,否则遍历链表,若长度不小于8,则将链表转为红黑树,转成功之后 再插入。
04-说说对反射的理解 项目当中用到了反射吗?
- 用 IoC 来注入和组装 bean
- 动态代理、面向切面、bean 对象中的方法替换与增强,也使用了反射
- 定义的注解,也是通过反射查找
05-什么是回表查询
特定情况下的一种查询的步骤:
一般数据库建表时,会创建索引,以普通索引为例,创建的索引结构中包含的是聚簇索引的值(一般就是主键id),在根据此普通索引进行查询时,首先会查到普通索引的位置,比如下标是110,那么会从110处取出聚簇值,也就是id值,再拿id值取表中取数据,
这个过程就叫做回表。
再说下什么是聚簇索引,一个表建立后,如果有主键,主键就是默认的聚簇索引,它的特点就是,数据的物理存储顺序和索引顺序一致,一个表建立好了,存储的物理顺序也不会再改变了,所以也说,聚簇索引只有一个。没有主键,就会自动建立。
06-慢SQL日志怎么开 怎么看?
- slow_query_log:慢查询开启状态
- slow_query_log_file:慢查询日志存放的位置(一般设置为 MySQL 的数据存放目录)
- long_query_time:查询超过多少秒才记录
可以通过 log-slow-queries 选项开启慢查询日志。通过 long_query_time 选项来设置时间值,时间以秒为单位。如果查询时间超过了这个时间值,这个查询语句将被记录到慢查询日志。
- dir 参数指定慢查询日志的存储路径,如果不指定存储路径,慢查询日志将默认存储到 MySQL 数据库的数据文件夹下。
- filename 参数指定日志的文件名,生成日志文件的完整名称为 filename-slow.log。 如果不指定文件名,默认文件名为 hostname-slow.log,hostname 是 MySQL 服务器的主机名。
- “n”参数是设定的时间值,该值的单位是秒。如果不设置 long_query_time 选项,默认时间为 10 秒。
07-springboot的核心注解有哪些
- @Configuration
- @Import
- @SpringBootApplication
- @ConditionalOnJava
08-springboot的启动流程?
0.启动main方法开始
1.初始化配置:通过类加载器,(loadFactories)读取classpath下所有的spring.factories配置文件,创建一些初始配置对象;通知监听者应用程序启动开始,创建环境对象environment,用于读取环境配置 如 application.yml
2.创建应用程序上下文-createApplicationContext,创建 bean工厂对象
3.刷新上下文(启动核心)
3.1 配置工厂对象,包括上下文类加载器,对象发布处理器,beanFactoryPostProcessor
3.2 注册并实例化bean工厂发布处理器,并且调用这些处理器,对包扫描解析(主要是class文件)
3.3 注册并实例化bean发布处理器 beanPostProcessor
3.4 初始化一些与上下文有特别关系的bean对象(创建tomcat服务器)
3.5 实例化所有bean工厂缓存的bean对象(剩下的)
3.6 发布通知-通知上下文刷新完成(启动tomcat服务器)
4.通知监听者-启动程序完成
09-你对redis中的主从复制,哨兵模式你了解吗?
Redis主从复制 主要是分为全量同步和部分同步
全量同步一般发生在slave初始化阶段,这个时候slave需要将master上的数据都复制一遍,后边部分同步都是在master发生变化后,slave进行的部分同步
当一个从数据库启动的时候,会向主数据库发送sync命令
当主数据库收到sync命令后会在后台保存快照(执行rdb操作),并在缓存区记录后面所有的写操作
当主数据库快照保存完整后,redis会将主数据库快照文件发送给从数据库
从数据库收到快照后,会丢弃原有的数据库,载入收到的快照
主数据库发送完快照后,会开始向从数据库中发送从数据库的写命令
从数据库完成对快照的载入,会接受请求,开始执行向从数据库中执行相对应的写操作
10-微服务服务降级、熔断的实现
01spring的中设计到的设计模式
02springmvc有哪些主键做什么用的?
03spring如何配置事务
04 aop的有哪些通知,什么特点
05 stream流你项目中如何使用
2、要求
1、上午整理面试题,自己可以查询百度等方式完成,要求,1 逻辑清晰,2语言简洁 3、3-4点即可
2、下午3点在老师桌子上拿取白纸写面试题答案,自己对自己上午的内容进行验收
3、下周会检查,验收大家周末的面试体整理情况
4、都能完成的可以继续复习整理以前的内容或者整理微服务springcloud组件