面试题总结

28
四月
2021

Spring

文章目录

    • Spring
      • 1. 你对Spring的了解
      • 2. SpringBoot运行机制
      • 3. SpringCloud
    • Mybatis(ORM框架)
      • 1.缓存有哪几种,通过什么开启
      • 2. Redis缓存雪崩和缓存穿透
      • 3. xml标签
      • 4. 执行器有哪些
      • 5. 动态代理的实现
      • 4. 嵌套查询和嵌套结果的区别
      • 5. #和$的区别
    • Mysql
      • 2. 搜索引擎
      • 3. 隔离级别
      • 4. 优化
      • 5. 常用函数
      • 6. 分页
    • 基础
      • 1. cookie和session
      • 2. 死锁
      • 3. 统计一个字符串中每个字符出现的次数
      • 4. String的常用方法
      • 5. servlet生命周期
      • 6. http/https
      • 7. ssl四次握手
      • 8. tcp/udp/
      • 9. 线程的状态
      • 10. 自定义注解
      • 11.Java特性
      • 12. List/Map/Set
      • 13. 怎么打出线程栈信息
      • 14. 强引用、软引用、弱引用、虚引用的区别?
      • 15. JVM内存模型
      • 16. Java设计模式-单例模式
      • 17. JWT
      • 18. springcloud 网关

1. 你对Spring的了解

  • 轻量级框架
  • 特性:IOC控制反转和AOP面向切面
    • IOC:将创建对象的操作交给spring容器管理,通过Autowired/Resource来注入,由spring创建的对象,作用域有单例(默认)、原型、请求、会话、全局等
    • AOP:在不修改原有业务的基础上,动态织入一些其他业务,最常用的打印日志
  • 单例:会引起多线程安全问题
  • 注解:
    • component和bean的区别

2. SpringBoot运行机制

3. SpringCloud

组件:注册中心eureka,网关zuul,负载均衡ribbon,配置中心config,熔断器…

  • eureka自我保护机制:不会立马挂掉

  • 负载均衡策略:轮询、权重、一致性hash、最小活跃度

  • 熔断器:

Mybatis(ORM框架)

1.缓存有哪几种,通过什么开启

一级缓存:一次查询之后放入一级缓存,下一次直接从缓存中取,能满足日常需求

二级缓存:

​ 开启方式:在mybatis配置文件中开启,并在mybatis.xml中打上cache标签

​ 弊端:不太友好,可使用Redis替代

2. Redis缓存雪崩和缓存穿透

缓存雪崩:大量请求到达数据库;

  • 发生场景:redis中的key大量同时过期,请求直接到达数据库

  • 解决办法:在给key设置过期时间时,不用固定的时间,可使用随机时间;对于热点key,可设置较长过期时间;

缓存穿透:Redis和数据库都没有该数据,导致每次的恶性循环

  • 发生场景:恶意攻击

  • 解决办法:

    • 和Redis结合:即使数据库没有查出数据,也要往Redis里存入一个key;
    • 限制恶意Ip访问;
    • 布隆过滤器

3. xml标签

select、update、where、if、trim、

sql、include

foreach、when

4. 执行器有哪些

5. 动态代理的实现

接口和xml的绑定:

1. xml的namespace指定接口类全路径
2. xml中sql的id与接口中方法名一致

4. 嵌套查询和嵌套结果的区别

  • 嵌套查询:
  • 嵌套结果:一条sql就能拿到结果

5. #和$的区别

#防止sql注入

$相当于拼接,会引起sql注入

Mysql

### 1. mysql索引底层数据结构是什么样的

答:

  1. 索引(.frm文件):

    类型:唯一索引、组合索引、聚集索引、非聚集索引

    优点:提高查询效率

    缺点:牺牲了插入删除等性能,因为每次数据变更都需要重新维护索引结构,所以创建的时候对经常变更的字段不应该建立索引

  2. 索引底层数据结构:hash和B+tree

    1. hash不支持范围查询
    2. B+tree支持范围查询
  3. mysql搜索引擎:myisam和innodb,都支持hash和B+tree

    1. myisam没有事务的概念,所以没有隔离级别

2. 搜索引擎

3. 隔离级别

默认可重复读

可重复读:

不可重复读:

脏读:

幻读:

4. 优化

  1. 对常用字段建立索引
  2. 避免编写导致索引失效的sql,比如:

5. 常用函数

count、max、min、

6. 分页

limit(开始索引,条数)

基础

1. cookie和session

  • cookie

    • 保留在客户端,在每次请求时都回传给后台,所以一般情况session依赖于cookie,若客户端禁用cookie,可以使用url携带
    • 存储大小:4k
  • session

    • 由服务器生成和存储的,创建之后返回给客户端,之后再由cookie携带sessionId来认证身份
    • 存储大小:

2. 死锁

3. 统计一个字符串中每个字符出现的次数

字符串转数组,遍历+1

4. String的常用方法

indexof、substring、split、replace、trim、

5. servlet生命周期

加载和实例化——初始化——请求处理——服务终止

6. http/https

httphttps(http+ssl)
安全性明文传输,不安全加密传输,使用会话密钥进行对称加密,减少加密耗费时间
状态无状态无状态

img

7. ssl四次握手

客户端服务端
1.支持的协议版本,比如TLS 1.0版
2.一个客户端生成的随机数,稍后用于生成"对话密钥"
3.支持的加密方法,比如RSA公钥加密
4.支持的压缩方法
1.确认使用的加密通信协议版本,比如TLS 1.0版本。如果浏览器与服务器支持的版本不一致,服务器关闭加密通信。
2.一个服务器生成的随机数,稍后用于生成"对话密钥"
3.确认使用的加密方法,比如RSA公钥加密
4.服务器证书
验证服务器证书
1.一个随机数pre-master key。该随机数用服务器公钥加密,防止被窃听
2.编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥(客户端+服务端+pre-master key)发送
3.客户端握手结束通知,表示客户端的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供服务器校验
4.发送证书及相关信息(非必须,如果服务器要求的话,会发送客户端证书)
1.编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥(客户端+服务端+pre-master key)发送
2.服务器握手结束通知,表示服务器的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供客户端校验
  • 为什么要有第三个随机数pre-master key的存在?

    答:SSL协议不信任每个主机都能产生完全随机的随机数,如果随机数不随机,那么pre master secret就有可能被猜出来,因此必须引入新的随机因素,那么客户端+服务器+pre-master key三个随机数一同生成的密钥就不容易被猜出了

img

8. tcp/udp/

tcp三次握手、四次挥手

挥手:time_wait主动挥手时才有

tcpudp
共同点同属于tcp/ip协议簇
是否连接通信之前要建立安全连接,三次握手连接无需连接
传输可靠性可靠不可靠
速度
数据量大量少量

9. 线程的状态

新建、就绪、运行、阻塞、死亡

img

10. 自定义注解

11.Java特性

12. List/Map/Set

13. 怎么打出线程栈信息

思路: 可以说一下jps,top ,jstack这几个命令,再配合一次排查线上问题进行解答。

我的答案:

输入jps,获得进程号。
top -Hp pid 获取本进程中所有线程的CPU耗时性能
jstack pid命令查看当前java进程的堆栈状态
或者 jstack -l > /tmp/output.txt 把堆栈信息打到一个txt文件。
可以使用fastthread 堆栈定位,fastthread.io/

14. 强引用、软引用、弱引用、虚引用的区别?

https://blog.csdn.net/qq_41701956/article/details/100074023 第10点

15. JVM内存模型

线程共享:

​ 方法区:存放字符串常量、静态变量

​ 堆:new的对象

线程私有:

​ 栈:对象的引用地址

​ 本地方法栈:

​ 程序计数器:

16. Java设计模式-单例模式

单例的懒汉、饿汉模式

懒汉模式:在被调用的时候才创建;

饿汉模式:

17. JWT

有三部分组成:头部+载荷+签名

  • 头部header:声明类型+加密算法,然后将头部进行base64加密,构成了第一部分;
  • 载荷payload:存放用户身份信息和jwt过期时间;
  • 签名:需要base64加密后的header和base64加密后的payload使用.连接组成的字符串,然后通过header中声明的加密方式进行加密

​ 完整的头部就像下面这样的JSON:

{
  'type': 'JWT',
  'alg': 'SHS256'
}

缺点:消耗性能

使用session,分布式可能存在的问题:

​ session只有每次请求都在登录的这台服务器上,用户才能认证成功;

​ 解决方式:用Redis集群来存放session

18. springcloud 网关

TAG

网友评论

共有访客发表了评论
请登录后再发布评论,和谐社会,请文明发言,谢谢合作! 立即登录 注册会员