遇到的面试题

163 阅读7分钟

前言

主要用于记录面试阶段遇到的面试题

正文

1、SpringBoot相关

相关注解:

  • @SpringBootApplication: 由@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan组成

  • @MapperScan: 标志扫描dao的范围

  • @SpringBootConfiguration: 继承自@Configuration,标注当前类为配置类

  • @ComponentScan: 开启组件扫描

  • @EnableAutoConfiguration: 借助@Import的支持,收集和注册相关的bean定义

  • @EnableFeignClients: 表示服务支持Feign远程调用

  • @EnableEurekaClient: 表示要注册到Eureka服务中

  • @Repository: 标注数据访问组件,即Dao组件

  • @Service: 修饰Service层的组件

  • @RestController: 标注控制层组件 @Controller @ResponseBody 表示该方法的返回结果直接写入HTTP Response body中

  • @Bean: 创建一个Bean,并交给spring管理

  • @Autowired: 自动导入配置Bean

启动流程:www.cnblogs.com/trgl/p/7353…

2、SpringCloud

  • Eureka 注册中心

    eureka: 服务注册中心,对外暴露自己的地址

    提供者: 定期向eureka注册自己的信息

    消费者: 向eureka订阅服务,eureka会把服务的相关地址列表发送给消费者,并定时更新

    心跳: 服务提供者定期向eureka通过HTTP形式刷新自己的状态,每30秒一次

    服务下线: 服务正常关闭,服务方发送一个rest请求给EurekaServer,告知自己下线

    服务剔除: 定时(默认60s)剔除超过90s没有续约的服务

    自我保护机制: 15分钟内超过85%的客户端没有正常的心跳,eureka认为客户端与注册中心出现了网络故障,自动进入保护模式

  • zuul 网关

    netflix开源的微服务网关,作用:路由、控制、控流

  • Ribbon 负载均衡

    默认采用轮询算法,其他算法:hash、权重、一致性hash

  • Feign 服务调用

    解决服务间远程调用问题

  • Hystix 熔断器

    解决雪崩效应

    雪崩效应: 某一个服务出现问题,导致响应速度变慢,或是根本没有响应返回,会导致它的服务消费者由于长时间的等待,消耗尽线程,进而影响到对其他服务的线程调用,进而会转变为整个应用的故障

3、Spring生态

  • Spring: 生态体系
  • Spring Framework: Spring框架,基础AOP、IOC
  • SpringMVC: 基于Spring框架搭建的web框架
  • SpringBoot: 基于Spring框架的一套快速开发整合包

4、AOP和IOC原理

  • IOC:控制反转 / 依赖注入

    利用工厂模式,将对象交给容器管理,由spring容器创建,然后注入调用者

  • AOP:面向切面编程

    AOP: 动态代理 | 拦截类的元数据(包、类、方法名、参数) | 日志、异常处理

    过滤器:函数回调 | 拦截URL | 修改request、URL级别的权限

    拦截器:反射机制 | 拦截URL | 权限校验、日志

    顺序:过滤器 -> 拦截器 -> AOP

5、线程实现方式和区别

  • 继承Thread类
  • 实现Runnable接口 无返回值
  • 实现Callable接口 有返回值

6、线程池创建方法

  • Executors工厂方法创建

  • new ThreadPoolExecutor()创建

    可自定义线程池,参数:

    corePoolSize: 核心线程数,线程池中始终存活的线程数

    maximumPoolSize: 最大线程数

    keepAliveTime: 线程存活时间

    unit: 存活时间单位

    workQueue: 线程阻塞队列,一共7种,都是安全的

    threadFactory: 线程工厂,主要用来创建线程

    handler: 拒绝策略

7、线程常用方法

Thread.currentThread(): 获取当前线程对象

getPriority(): 获取当前线程的优先级

setPriority(): 设置当前线程的优先级

isAlive(): 判断线程是否处于活动状态

join(): 调用join方法的线程强制执行,其他线程处于阻塞状态,直至该线程完成

sleep(): 使当前线程休眠指定时间,休眠的线程进入阻塞状态

yield(): 当前线程进入就绪状态,重新去抢占CPU

interrupt(): 中断线程

wait(): 使线程等待,进入阻塞状态;使用于同步方法或同步代码块

notify(): 使线程唤醒,进入就绪状态(获取到同步锁后进入就绪);使用于同步方法或同步代码块

notifyAll(): 唤醒所有等待的线程;使用于同步方法或同步代码块

image.png

8、Redis集群高可用

9、RabbitMQ消息丢失

  • 重复消费问题: 第三方介质,如redis记录消费之后的消息
  • 生产者丢数据: confirm确认机制
  • 消息队列丢数据: 消息持久化磁盘
  • 消费者丢数据: 自动确认模式/手动确认模式

10、Ctrl层相关注解

  • @RequestParam

    参数: 来自于HTTP请求体或请求url 对传入参数指定参数名; 配置前端参数是否必传;

  • @RequestBody

    解析请求body中json格式的数据 参数: 来自于RequestBody请求体,故不适用于get

  • @PathVariable

    绑定占位符参数

  • @RequestHeader

    绑定请求头数据

form-data、x-www-form-urlencoded: 不可以用@RequestBody;可以用@RequestParam

application/json: json字符串部分可以用@RequestBody;url中的?后面参数可以用@RequestParam

11、设计模式

12、集合

HashMapHashTable
null值key/value可以为null不能
synchronized非,线程不安全是,线程安全
遍历方式fail-fast迭代器fail-fast迭代器(JDK8以后)
ArrayListLinkedList
数据结构动态数组双向链表
随机访问通过对应位置索引,查询速度快需要移动指针,查询速度慢
增删操作需要改变增删涉及元素的地址,所以增删慢改变插入点或删除点前一个的元素的指向就可以,所以增删快
内存占用

Lsit、set和map的区别

a) List (实现了collection接口)

    i. 可以允许有重复的对象

    ii. 可以插入多个null元素

    iii. 是一个有序容器,保持了每个元素的插入顺序

b) Set(实现了collection接口)

    i. 不允许重复对象

    ii. 无序的容器,无法保证每个元素的储存顺序;而TreeSet可以通过Comparator或Comparable进行顺序排序

    iii. 只允许一个null元素

    iv. LinkedHashSet按照元素的插入顺序对它们进行存储

c) Map(不是collection的子接口或实现类。Map是一个接口)

   i. Map是以键值对的存储方式存放数据,key是唯一的,value可以重复

   ii. Map中可以有多个null值,但只能有一个null键

   iii. TreeMap也可以通过comparator或者comparable维护排序顺序

13、避免线程死锁

死锁产生条件

  • 互斥条件:该资源任意一个时刻只由一个线程占用
  • 请求与保持条件:一个线程因请求资源而阻塞时,对已获得的资源保持不放
  • 不剥夺条件:线程已获得的资源不能被其他线程强行剥夺,只有使用完毕才释放资源
  • 循环等待条件:若干进程直接形成一种头尾相接的循环等待资源关系 避免方式:
  • 破坏互斥条件: 这个条件我们没有办法破坏,因为我们用锁本来就是想让他们互斥的(临界资源需要互斥访问)
  • 破坏请求与保持条件: 一次性申请所有的资源
  • 破坏不剥夺条件: 占用部分资源的线程进一步申请其他资源时,如果申请不到,可以主动释放它占有的资源
  • 破坏循环等待条件: 靠按序申请资源来预防。按某一顺序申请资源,释放资源则反序释放。破坏循环等待条件

14、配置文件值的引入方式

@ConfigurationProperties

  • 与@Bean结合为属性赋值
  • 与@PropertySource(只能用于properties文件)结合读取指定文件
  • 与@Validation结合,支持JSR303进行配置文件值的校验,如@NotNull@Email等

@Value

  • 为单个属性赋值
  • 支持属性上的SpEL表达式
@ConfigurationProperties@Value
功能批量注入配置文件中的属性一个个指定
松散绑定支持不支持
SpEL不支持支持
JSR303数据校验支持不支持
复杂类型封装支持不支持

15、单元测试