面试分类
邮储
一、项目相关
自我介绍
在项目中遇到的挑战,最大的挑战的经历是什么样子的针对简历上项目相关的问题/场景,详细说其中的内容所在项目主要负责哪些,遇到哪些问题,怎么解决
二、技术相关
装饰器模式与代理模式区别
- 代理模式:代理与原始对象的关系是静态的,通常在编译时确定代理逻辑,代理类直接引用被代理对象,通常包装一个特定对象,且不允许多层嵌套,可能创建或管理被代理对象的生命周期。
- 装饰器模式:装饰器与对象的关系是动态的,可在运行时按需叠加多个装饰器,形成链式结构,允许多层嵌套,每层添加独立功能,仅依赖已有的对象,不控制其生命周期。
- 代理模式:核心是管理对原始对象的访问,如权限校验、延迟加载、缓存等。
- 装饰器模式:核心是为对象动态添加新职责,如日志记录、加密、格式转换等。
1. spring的事务有哪些
2. spring openFeign配置相关
@EnableFeignClients
@FeignClient(name = "user - service", url = "http://localhost:8081")
3.springboot是如何简化开发的
约定大于配置
4.spring cloud 微服务的注册于发现
5.springcloud的组件有哪些
6.事物在springboot中如何开启
@Transactional
7.Spingboot配置文件的优先级
相同位置下,格式优先级从高到低为:
- .properties:传统键值对格式(
key=value
),优先级最高; - .yml:YAML 格式(缩进敏感,
key: value
),优先级次之; - .yaml:与
.yml
完全等价(仅后缀不同),优先级最低。
外部配置 > 内部配置,命令行参数优先级最高,可临时覆盖所有配置
8.spring @AutoWaired和@Resource有什么区别
@Autowired 按类型 ,需配合@Qualifier
指定名称
@Resource 按名称(byName)
9.redis的存储对象,如何使用
10.什么是Redis分布式锁
11.什么是缓存击穿、穿透,雪崩
12.redis怎么持久化
13.redis大批量读取写入数据优化
Redis 提供了专门的批量写入命令,减少网络交互次数
MSET/MHSET
Pipeline(管道):客户端将多个命令打包发送,减少 TCP 往返次数(非原子性,适合超大量数据)
// Java示例(Jedis客户端) try (Jedis jedis = jedisPool.getResource()) { Pipeline pipeline = jedis.pipelined(); for (int i = 0; i < 10000; i++) { pipeline.set("key:" + i, "value:" + i); } pipeline.sync(); // 执行所有命令 }
14.redis为什么快,redis如何持久化数据,redis如何保证与数据库数据一致性
15.3主3从的Redis集群最多挂几台机器后仍可用
最多可以挂掉 3 台机器且集群仍能正常可用,但需满足特定条件。这一结论与 Redis 集群的主从复制、故障转移机制及quorum(仲裁) 规则密切相关,具体分析如下:
主 3 从集群中,最多挂 3 台机器仍可用的情况是 **“挂掉 1 主 + 2 从” 或 “挂掉 3 个从节点”**
关键规则:集群可用的判定条件
Redis 集群要保持可用,需同时满足两个条件:
- 所有主节点的槽位均有节点负责:16384 个槽位必须全部分配到可用的主节点(或通过故障转移升级的从节点);
- 集群能达成 quorum(仲裁):对于任意主节点的故障,需有超过半数的主节点(不包括故障主节点自身)认为其 “客观下线”(Objectively Down),才能触发从节点的故障转移。
16.消息队列为什么会消息丢失
通常与生产端发送、MQ 服务端存储、消费端处理三个环节的设计缺陷或配置不当有关。以下是各环节导致消息丢失的具体原因及底层逻辑:
同步发送未处理确认响应:Kafka 生产者未设置acks=all
MQ 服务端接收消息后,若未正确持久化或存储逻辑异常,会导致消息丢失。
消费端从 MQ 拉取消息后,若在处理完成前误确认 “消息已消费”,会导致消息丢失。
17.消息队列消息堆压怎么处理
18.消息队列出现积压情况,会怎么样
生产端发送受阻(如设置了max.message.bytes
或队列长度限制)
数据时效性失效:积压的消息可能因超时(如订单超时未支付)导致业务逻辑失效,处理后的数据成为 “脏数据”。
处理:
扩容 MQ 服务端:若因资源不足导致积压(如磁盘满),临时扩容 MQ 节点的存储 / 内存资源,或增加分区数量(如 Kafka 的partitions
)以提升并行处理能力。
消费端扩容:临时增加消费端实例数量(水平扩容),利用 MQ 的分区 / 队列负载均衡机制(如 Kafka 的消费者组重平衡、RabbitMQ 的队列分区),提升并行消费能力。
19.sql的递归查询
20.sql 性能优化
避免使用NOT IN
、!=
、<>
(可能导致全表扫描),改用NOT EXISTS
或范围查询:
-- 差:可能全表扫描 SELECT * FROM users WHERE id NOT IN (1, 2, 3); -- 好:效率更高 SELECT * FROM users u WHERE NOT EXISTS (SELECT 1 FROM blacklist b WHERE b.user_id = u.id);
21.mysql的左右连接有什么区别
22.mysql的联合索引
23.mysql事务隔离级别
24.mysql 慢查询
25.mysql如何保证事物一致性
26.linux查看端口命令
27.liunx 查看内存磁盘等相关操作命令
28.多表关联时on条件与where条件的区别
INNER JOIN 只返回连接能匹配上的数据行,不像左连接返回左表所有行,所以内连接使用 ON和WHERE效果一样
29.表连接方式有哪些,区别点
30.建立索引的优劣点,复合索引的字段顺序问题
31.like走不走索引
32.like关键字会导致索引失效吗
33.谈谈联合索引、 索引优缺点,表连接
34.组合索引(A,B,C),查的时候用(A,C)会生效吗
35.索引失效大概有哪些情况
36.事务隔离级别
37.事务失效的场景
38.Java中深拷贝和浅拷贝的区别
浅拷贝不会复制原对象内部的引用类型成员,引用类型成员会指向同一块内存地址。
39.Kafka怎么保证消息按顺序消费
40.多线程的生命周期、线程池有哪些、核心参数有哪些、线程创建方式有哪些
41.多线程之间父子线程上下文共享问题
Java 提供InheritableThreadLocal
类,仅支持线程创建时的一次性复制,父线程后续修改不会同步到子线程。线程池里的线程创建后不会重新复制父线程上下文,不能获取到变量
阿里的TransmittableThreadLocal
(TTL):支持线程池场景下的上下文传递,父线程上下文更新后,子线程可感知最新值;需要配合TtlRunnable
/TtlCallable
包装任务。
42.jvm底层原理
43.jvm调优
核心目标是平衡内存使用、GC 效率和应用响应速度。
核心参数配置(必调参数)
| 初始堆内存 | 与 |
| 最大堆内存 | 根据物理内存设置(如 8G 内存设 |
| 年轻代大小 | 堆内存的 1/3~1/2(如堆 4G 时设 |
| Eden 与 Survivor 比例 | 默认 |
| 元空间初始大小 | 默认 20.75M,可设 |
| 元空间最大大小 | 避免无限制增长,如 |
| GC 收集器选择 | JDK 9 + 默认,低延迟场景推荐 G1;大堆(>10G)可选 ZGC/Shenandoah |
不同 GC 收集器适用于不同场景,需根据应用特性选择:
Serial GC | 单线程、小堆(<1G)、嵌入式系统 | 简单高效,内存占用少 | 单线程 GC,停顿长 | 所有版本 |
Parallel GC | 多 CPU、吞吐量优先(如后台任务) | 多线程回收,吞吐量高 | 停顿较长 | 所有版本(默认在 JDK 8) |
CMS GC | 低延迟(如 Web 应用),中堆(<16G) | 并发回收,停顿短 | CPU 占用高,内存碎片多 | JDK 9 + 废弃 |
G1 GC | 中大型堆(1-32G),平衡延迟与吞吐量 | 分区回收,可预测停顿 | 复杂场景调优难 | JDK 9 + 默认 |
ZGC | 超大堆(>32G),超低延迟(<10ms) | 停顿极短,支持 TB 级堆 | 吞吐量略低 | JDK 11+ |
44.一个对象怎么被回收 (内存管理中的垃圾回收)
45.jvm32位和64位int长度
int
类型的长度都是固定的 32 位(4 字节),boolean-1、byte-1、char-2、short-2、long-8、float-4、double-8
46.32位虚拟机与64位的int类型的大小
47.int和integer 谁内存占的大
48.map的底层原理,线程安全的map原理
49.删除数据有哪些方式、数据库删除的方式
50.用oracle数据库查5条、10条数据怎么查
51.定时任务多节点部署,并发操作数据库写操作问题解决
52.es的实际应用场景,和常规数据库有哪些区别
ES:数据以 JSON 文档存储,会对所有字段自动创建倒排索引(分词后建立 “关键词→文档” 的映射),支持全文检索;
不保证多文档事务,适合 “最终一致性” 场景(如日志、搜索);
读性能(尤其是复杂检索)远高于传统数据库,但写入时因需构建索引,延迟略高
53.fegin怎么实现,xxljob怎么用的
54.string的intern方法
String.intern()
是一个 native 方法,用于将字符串放入字符串常量池(String Pool)并返回其引用,核心作用是实现字符串的复用,直接声明的字符串字面量(如 String s = "abc"
)会自动入池
55.类实例化(主要是类的字段和代码块哪些先执行或初始化)
类的加载顺序。
(1) 父类静态代码块(包括静态初始化块,静态属性,但不包括静态方法)
(2) 子类静态代码块(包括静态初始化块,静态属性,但不包括静态方法 )
(3) 父类非静态代码块( 包括非静态初始化块,非静态属性 )
(4) 父类构造函数
(5) 子类非静态代码块 ( 包括非静态初始化块,非静态属性 )
(6) 子类构造函数
56.trow和throws的区别
57.delete用法的注意事项
58.String中有哪些方法
59.Mybits的拦截器
60.http和https的区别
61.exception怎么处理
62.threallocal 微服务传递数据问题
63.nacos修改配置文件后如何保证一致性
64.ACID分别代表什么意思
65.访问一个网站整体流程
66.全局异常的注解
@RestControllerAdvice
@ExceptionHandler(value = Exception.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
67.异常处理类一般如何使用
68.无参,有参构造函数
69.定时任务常用的技术栈有哪些
ThreadPoolTaskScheduler