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