面试题复盘

1、常见的设计模式

设计模式有三大类:
创建型:单例模式、工厂方法模式、抽象工厂模式、原型模式
结构型:代理模式、装饰者模式
行为型:观察者模式

  • 单例模式:
    特点:1.单例类只能有一个实例对象
    2.单例类必须自己创建自己的实例
    3.单例类对外提供一个访问该单例的全局访问点。
    模式:恶汉模式:类一旦加载就创建一个单例
    懒汉模式:类需要的时候再创建这一单例
    多线程安全问题:加synchornized锁,并加入双重检查。
  • 代理模式:
    静态代理:不常用,类似装饰者模式
    动态代理:jdk的动态代理 代理对象必须至少实现一个接口
    cglib的动态代理 代理对象不能是最终类
    作用:在不修改源码的基础上对目标方法进行增强。
  • 工厂模式:
    作用:降低类和类之间的耦合
    分类:
    简单工厂:
    角色:抽象产品、具体产品、具体工厂
    缺点:不便于扩展,后期添加新产品,要修改工厂代码
    工厂方法:
    角色:抽象产品、具体产品、具体工厂、抽象工厂
    特点:抽象工厂提供生产某类产品的抽象方法,具体工厂继承抽象工厂,然后实现方法造具体的产品
    缺点:每增加一个类,就需要一个具体工厂,增加了代码复杂度
    抽象工厂:
    角色:抽象产品、具体产品、具体工厂、抽象工厂
    特点:抽象工厂可以造多种类型的产品,然后由具体工厂去创建该类型产品的具体产品
  • 原型模式:java的深克隆和浅克隆
    浅克隆:源对象和克隆对象中引用类型的属性指向的是同一个对象
    实现:Cloneable接口的Clone方法
    深克隆:原对象和克隆对象引用数据类型的属性指向不是同一个对象
    实现:io读写、json的序列化和反序列化
  • 装饰者模式:
    两个对象:目标类、装饰者类
    作用:在不修改源码的基础上对目标类进行方法增强
    特点:目标类和装饰者类要实现同一个接口,定义的目标类对外只提供带参构造,装饰者类中存在目标对象的引用(参数)。
  • 观察者模式:
    观察者随着被观察者的更新而更新。

2、线程池的相关问题

7个参数:核心线程数、线程总数、临时线程的过期时间、过期单位、阻塞队列、线程工厂、拒绝策略
工作流程:任务过来,核心线程处理,没有空闲的核心线程,任务到阻塞队列,有空闲核心线程,就处理队列中的任务,阻塞队列满了,创建临时线程处理,创建的线程达到最大线程量,触发任务拒绝策略。
任务抛弃策略:
1.丢弃任务,抛异常
2.哪个线程的往线程池添加的任务,哪个线程去处理,一般是main线程
3.将队列中最早的抛弃,当前的任务添加到队列
4.将队列中最新的抛弃,当前的任务添加到队列

3、创建线程的方式

1.Thread()类直接new
2.Thread()+Runnable
3.FutureTask+Callable
4.线程池

4、RabbitMQ在项目中的使用场景

异步通信
1.文章发布,同步信息到用户端
2.mysql的数据,同步信息到es
3.延迟消息队列:
- 定时发布
- 超时订单处理

5、Redis在项目中的使用场景

数据的缓存
1.登录时,保存验证码信息
2.热点数据
3.分布式锁:
- 下单扣减库存
- 用户行为,点赞,关注,保存到redis,然后发消息到mq,更新mysql数据库信息

6、良好编码规范

idea中安装了阿里巴巴的文档规约插件,不满足规约就会提示波浪线。
如:不能使用下划线
不能使用中文
命名符合驼峰命法
不能使用魔法值

7、项目登录的相关问题

1、登录的流程

1.用户在登录页面输入登录信息,将登录请求发送到网关
2.网关对请求进行判断,判断是否为登录请求,是登录请求就放行
3.放行到controller层对登录信息进行校验,如果登录信息都正确,就会生成通过JWT技术生成token返回给前端。
4.不是登录请求,就判断当前请求是否携带token
5.未携带,响应数据不存在;携带了,对token信息进行校验,校验成功再放行。

2、token的续命

1.登录成功后,生成token响应给前端,但是该token不设置有效时间
2.将登录的token信息存到redis中,给该键值对设置有效时间
3.用户下次访问后端时,会携带token,先到达网关。
4.网关对判断是否携带token,如果携带了token,再到redis中判断该token是否已经过期。如果已经不存在,就给前端响应403,token过期,重新登录;如果还存在,就给redis中的token信息重新设置过期时间为初始过期时间,可以根据redis中存储的key修改时间。然后登录成功即可。

3、登录接口如何进行加密

问题:登录的时候密码是明文,被黑客截获存在安全问题
解决:使用可逆加密算法的非对称性进行接口加密,即加密用公钥,解密用私钥
1.使用rsa加密算法生成一对公钥和私钥
2.将公钥给前端,前端通过公钥对登录信息进行加密
3.用户登录后,将登录信息传递到网关,网关判断是否为登录的请求,如果是登录请求,需要将加密的登录信息解谜后然后放行
4.如何解密:调用rsa工具类通过之前 生成好的私钥进行解密,然后将原请求头中的信息替换成解密后的信息。
5.因为请求头的信息不支持直接更改,可以使用装饰者模式,构建相同对象的请求头对象,更换装饰者中的信息。然后将装饰者对象放行。

8、String和StringBuilder

1.string不可变;stringbuilder可变,底层是一个char数组,是一个对象
2.string线程安全,stringbuilder线程不安全
使用场景:string:大多数场景
stringbuilder:拼字符串的场景

9、volatile关键字

作用:可见性、有序性;不能保证原子性。线程安全使用双检锁
使用场景:优雅的停止一个线程。

10、参加了表设计,如何设计表

如何设计:根据产品原型分析出输入字段、输出字段;外键、辅助字段(是否删除等)
设计软件:PowerDesigner软件
使用软件根据实际需求设计每一张表,然后根据具体情况建立表的关系,然后输出成sql语句,在mysql中执行即可

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值