跳到主要内容

20240516 面试

  1. 项目遇到比较困难的问题
  2. Java 继承和接口的区别, 接口提供方法 default。
  • 抽象类与接口的区别
    • 抽象类里面可以有非抽象方法,但是接口只有抽象方法。
    • 抽象类中的成员变量可以是任意类型的,但是接口的成员变量类型只能是 public static final
    • 只能继承一个类,但是可以实现多个接口
  • 抽象类是对代码的复用,至下而上的,先有子类,决定可以复用代码,就写一个抽象类,
  • 接口是对行为进行约束,至上而下的,先有接口,再有实现类。
  1. 线程池的使用,
  • 参数:核心线程数、最大线程数、存活时间、阻塞队列、拒绝策略、线程工厂
  • 流程:先判断核心线程数是否已满,没有满就直接创建线程,否则判断阻塞队列是否已满,没有满就把线程放入阻塞队列,满了就判断最大线程数是否已满,没有满就创建线程,满了就执行拒绝策略,根据拒绝策略来处理。
  • 阻塞队列的种类、安全性
    • ArrayBlockingQueue:基于数组的有界策略
    • LinkedBlockingQueue:基于链表的无界策略。
    • SynchronousQueue:一个不存储元素的阻塞队列,没个插入操作必须等待另一个线程的移除操作,反之亦然。
  • 设定线程池的大小
    • CPU 密集:cpu 核心数 + 1
    • IO 密集:2 * CPU 核心数
  • 如何保证线程池的高效运行
    • 线程池的大小
    • 阻塞队列的大小
    • 拒绝策略
      • 直接拒绝,不抛出异常
      • 直接拒绝,抛出异常
      • 在当前线程执行
      • 抛弃阻塞队列最早的哪个线程,然后把当前线程加入阻塞队列
  1. JVM 底层
  • 垃圾收集器 G1、CMS
    • 回收位置不同
    • 回收算法不同
    • 解决漏标不同
    • 内存碎片
    • STW
  • 垃圾收集器的适用场景:低延迟适合 G1
  1. MySQL
  • 数据存储到磁盘上的(可能是想考察 MySQL 的物理结构)
    • MySQL 数据存储在 结构上的,默认 16KB
    • 每个页并不是连续的,通过双向链表进行链接。
    • 表空间 -> 段 -> 区(64 个页) -> 页 -> 行
      • 文件头:页的信息
      • 页头:页的状态信息
      • 最大最小记录:
      • 用户记录:存储记录内容
      • 空闲记录:没被使用的空间
      • 页目录:记录记录的位置
      • 文件尾:校验页是否完整
    • 默认情况下,一个表会生成一个 idb 文件(最小存储单元是页)
  • 索引
    • 使用需要避开什么?(可能想考察的是应该如何选取索引)
      • 使用频率、字段类型、字段长度、区分度高的
    • 索引失效的集中情况
      • 不符合最左匹配原则
      • like 以 % 开头、函数、计算、类型转换
      • or 条件前后没有索引
    • id 自增出现 null 的情况
    • 哪些索引会导致效率下降。
      • 区分度不高的索引
      • 前缀索引,前缀长度设置不当可能回到索引下来下降
      • hash 索引:范围查询的适合会导致索引失效
  • 如何判断 SQL 是好的还是坏的
    • explain 查看执行计划
    • 判断 sql 有没有使用到索引
    • 根据 key,key_len 查看使用到哪些索引。
  • 数据库性能问题,瞬间流量特别大的情况。
    • 增大最大连接数
    • 读写分离
    • 优化 sql
    • 增加缓存
    • 增大 innodb_buffer_pool_size
  1. Session、Cookie、Token 的区别
  2. kafka、RabbitMQ 如何保证顺序
  • 一个队列设置一个消费者
  1. RabbitMQ 消息回退, 订单处理失败怎么处理, 死信队列
  • 消息消费失败之后,可以进行重试
  1. MyBatis
  • #$ 的区别,
    • # 占位、 $ 直接替换。防止 sql 注入
  • 缓存、一级缓存、二级缓存
  • 动态 SQL
    • if
    • choose、when、otherwise
    • trim、where、set
    • foreach
    • script
    • bind
    • 多数据库支持
  1. Redis
  • key 删除策略:惰性删除、定时删除
  • 淘汰策略:LRU、LFU
  • 持久化策略:AOF、RDB
  • 基本数据类型 String、list、set、hash、zset
  1. linux 命令查看 Java 进程
  • ps -ef | grep java
  • jsp