Java 热门面试题 200 道(Markdown表格版)【简化版】

Java与数据库核心面试题摘要
本文精选200道Java与数据库高频面试题,重点涵盖:


Java集合: HashMap原理(数组+链表/红黑树)、ConcurrentHashMap分段锁优化、红黑树改进目的(解决哈希冲突性能问题)
MySQL索引: 最左前缀原则、覆盖索引(避免回表)、B+树优势(矮胖结构适合磁盘IO)、聚簇/非聚簇索引区别
事务隔离: 脏读、不可重复读、幻读的典型场景
消息队列: RabbitMQ死信队列触发条件(消息拒收/TTL过期/队列满)、延迟队列实现方案
性能优化: 索引失效场景(函数操作/类型转换)、索引数量权衡(写性能与空间开销)


典型问题示例: MySQL索引下推(ICP)在引擎层提前过滤数据,减少回表次数;RocketMQ选用轻量级NameServer替代ZK以提升性能。

题目列表

No.titleanswertagList
1说说 Java 中 HashMap 的原理?HashMap 基于哈希表实现,使用数组+链表/红黑树存储数据。通过 key 的 hashCode 计算桶位置(数组索引),发生哈希冲突时采用链地址法解决(JDK1.8 后链表长度≥8时转为红黑树)。允许 null 键/值,非线程安全。扩容时容量翻倍并重新哈希。Java,Java 基础
2Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别?1.7 使用分段锁(Segment),每个段独立加锁;1.8 改为 CAS + synchronized 锁单个桶(Node)。1.7 只有链表,1.8 引入红黑树优化长链表查询。1.8 的 size() 计算改用 baseCount + CounterCell 避免全局锁。Java 集合,Java
3为什么 JDK 1.8 对 HashMap 进行了红黑树的改动?解决哈希冲突严重时链表过长导致的查询效率退化(O(n) 降至 O(logn))。当链表长度 ≥8 且数组容量 ≥64 时转为红黑树;节点数 ≤6 时退化为链表。平衡空间与时间开销。Java 集合,Java
4JDK 1.8 对 HashMap 除了红黑树还进行了哪些改动?1. 头插法改为尾插法(避免多线程扩容死循环) 2. 扩容时旧链表拆分为高低位链表(优化重新哈希计算) 3. 计算哈希值:高位参与运算 (h = key.hashCode()) ^ (h >>> 16) 4. 初始化延迟到首次 put 时。Java 集合,Java
5Java 中有哪些集合类?请简单介绍List:ArrayList(数组)、LinkedList(双向链表)、Vector(线程安全数组) Set:HashSet(基于HashMap)、TreeSet(红黑树)、LinkedHashSet(链表保序) Map:HashMap、TreeMap(键有序)、LinkedHashMap(插入序)、ConcurrentHashMap(线程安全) Queue:ArrayDeque、PriorityQueue(堆)Java 集合,Java
6MySQL 索引的最左前缀匹配原则是什么?联合索引 (a,b,c) 生效条件:查询必须包含最左列 a。能匹配 a、a,b、a,b,c 的组合,但无法跳过 a 直接查 b,c。原理:索引按列顺序存储,缺失左列时无法利用有序性。后端,MySQL,数据库
7数据库的脏读、不可重复读和幻读分别是什么?脏读:读到未提交的数据(事务A读事务B未提交修改) 不可重复读:同事务内两次读同一数据结果不同(因其他事务修改) 幻读:同事务内两次查询结果集数量不同(因其他事务增删数据)。后端,MySQL,数据库
8MySQL 的存储引擎有哪些?它们之间有什么区别?InnoDB:支持事务、行锁、外键、聚簇索引,适用OLTP MyISAM:表锁、全文索引、高读性能,不支持事务,适用OLAP Memory:内存存储,数据易丢失 区别核心:事务支持(InnoDB支持)、锁粒度(InnoDB行锁 vs MyISAM表锁)、崩溃恢复能力。后端,MySQL,数据库
9MySQL 的覆盖索引是什么?索引包含查询所需所有字段(如 SELECT a,b FROM t WHERE c=1,索引 (c,a,b))。避免回表查询(直接从索引取数据),显著提升性能。EXPLAIN 显示 “Using index” 即使用了覆盖索引。后端,MySQL,数据库
10MySQL 的索引类型有哪些?1. 主键索引(唯一 + 非空) 2. 唯一索引(列值唯一) 3. 普通索引(加速查询) 4. 全文索引(FULLTEXT,文本搜索) 5. 组合索引(多列联合) 6. 空间索引(GIS 数据)。后端,MySQL,数据库
11MySQL 的索引下推是什么?ICP(Index Condition Pushdown):在存储引擎层提前过滤索引条件(即使非最左前缀)。例如索引 (a,b),查询 WHERE a=1 AND b>2,引擎层直接过滤 b>2,减少回表次数。需满足条件:range/ref/eq_ref 查询,且存储引擎支持(默认开启)。后端,MySQL,数据库
12MySQL InnoDB 引擎中的聚簇索引和非聚簇索引有什么区别?聚簇索引:叶子节点存数据行(主键索引即聚簇索引) 非聚簇索引(二级索引):叶子节点存主键值,需回表查询数据 区别:1. 数据存储位置(聚簇索引与数据共存) 2. 查询效率(聚簇索引无需回表) 3. 数量限制(每表仅一个聚簇索引)。后端,MySQL,数据库
13MySQL 中的回表是什么?通过二级索引查询时,需先查索引找到主键值,再根据主键到聚簇索引中取完整数据行。额外 IO 操作导致性能下降。避免方式:使用覆盖索引或优化索引设计。后端,MySQL,数据库
14MySQL 中使用索引一定有效吗?如何排查索引效果?不一定有效。失效场景:函数操作索引列、类型隐式转换、OR 条件未全索引、LIKE 以通配符开头、不符合最左前缀。排查:1. EXPLAIN 看 type/possible_keys/key 2. 观察 rows 字段预估扫描行数 3. 开启慢查询日志分析。后端,MySQL,数据库,场景题
15RabbitMQ 怎么实现延迟队列?两种方式: 1. 死信队列(DLX):消息设置 TTL 过期后转投 DLX 2. 插件(rabbitmq_delayed_message_exchange):使用 x-delayed-type 交换机,消息头设置 x-delay 参数(毫秒)。推荐插件方式避免 TTL 队列阻塞问题。后端,消息队列,RabbitMQ
16MySQL 中的索引数量是否越多越好?为什么?不是。原因:1. 写性能下降(增删改需维护所有索引) 2. 空间占用增加 3. 优化器选择困难可能选错索引。建议:根据查询需求创建必要索引,优先组合索引覆盖多查询,定期分析索引使用率(SHOW INDEX 观察 Cardinality)。后端,MySQL,数据库
17为什么 RocketMQ 不使用 Zookeeper 而选择自己实现 NameServer?1. 轻量化:NameServer 无选举逻辑(AP 系统),ZK 是 CP 系统较重 2. 性能:NameServer 纯内存操作,吞吐更高 3. 去中心化:各 NameServer 节点独立无状态,避免 ZK 集群瓶颈 4. RocketMQ 只需简单服务发现,无需 ZK 强一致性。RocketMQ,消息队列,后端
18请详细描述 MySQL 的 B+ 树中查询数据的全过程1. 从根节点开始二分查找 2. 沿非叶子节点(仅存索引键 + 指针)逐层向下定位 3. 到达叶子节点(存数据行或主键) 4. 在叶子节点链表二分查找目标键 5. 若聚簇索引直接返回数据;若二级索引则取主键回表查询。后端,MySQL,数据库
19RabbitMQ 中消息什么时候会进入死信交换机?触发条件: 1. 消息被消费端拒绝(basic.reject/nack)且 requeue=false 2. 消息 TTL 过期 3. 队列达到最大长度(溢出丢弃)。需配置队列的 x-dead-letter-exchange 参数绑定死信交换机。RabbitMQ,消息队列,后端
20为什么 MySQL 选择使用 B+ 树作为索引结构?对比 B 树: 1. 更矮胖:非叶子节点不存数据,单节点存更多键,减少 IO 次数 2. 范围查询高效:叶子节点双向链表串联 3. 查询稳定:所有查询均需到叶子节点,时间复杂度稳定 O(log n) 4. 更适合磁盘存储:节点大小匹配磁盘页。后端,MySQL,数据库
21RabbitMQ 中无法路由的消息会去到哪里?取决于 Mandatory 参数: 1. Mandatory=true:通过回调 ReturnListener 返回生产者 2. Mandatory=false(默认):直接丢弃。建议:设置备份交换机(Alternate Exchange)接收无法路由的消息。RabbitMQ,消息队列,后端
22MySQL 三层 B+ 树能存多少数据?假设: - 页大小 16KB - 主键 BIGINT(8B),指针 6B - 非叶节点每页存约 16KB/(8B+6B)≈1170 键 - 叶节点存数据行(假设1KB/行),每页约16行 计算:根节点有 1170 指针 → 二层 1170 页 → 三层 1170×1170≈137 万页 → 总行数 ≈ 137万 × 16 = 2190 万行。后端,MySQL,数据库
23Kafka为什么要抛弃 Zookeeper?1. 简化架构:减少外部依赖,运维更简单 2. 提升扩展性:元数据管理内置(KIP-500),突破 ZK 集群写瓶颈 3. 增强稳定性:避免 ZK 故障导致 Kafka 不可用 4. 改进控制器选举:用 Raft 协议替代 ZK 监听。从 Kafka 2.8 起支持 KRaft 模式。Kafka,Zookeeper,消息队列
24详细描述一条 SQL 语句在 MySQL 中的执行过程。1. 连接器:建立连接,权限验证 2. 查询缓存:若开启缓存且命中则直接返回(8.0 后移除) 3. 解析器:词法/语法分析,生成语法树 4. 优化器:选择索引,生成执行计划 5. 执行器:调用存储引擎接口 6. 存储引擎(InnoDB):读写数据(缓冲池、磁盘交互) 7. 返回结果。后端,MySQL,数据库
25Kafka 中 Zookeeper 的作用?在旧版本(KRaft 前)中负责: 1. Broker 注册:维护节点列表与状态 2. Topic 配置:存储分区、副本分配信息 3. 控制器选举:选主 Broker 管理分区leader 4. 消费者组:保存 offset 和组成员(新版 offset 存内部 Topic)。Kafka,消息队列,后端
26MySQL 是如何实现事务的?通过 InnoDB 引擎实现: 1. 原子性(A):Undo Log(回滚日志)记录修改前数据 2. 一致性(C):由 A+I+D 共同保证 3. 隔离性(I):锁 + MVCC(多版本并发控制) 4. 持久性(D):Redo Log(重做日志)保证崩溃恢复。后端,MySQL,数据库
27为什么 Java 8 移除了永久代(PermGen)并引入了元空间(Metaspace)?1. 永久代大小难调优:易触发 OOM 2. 类元数据生命周期与类加载器绑定,回收复杂 3. 元空间使用本地内存(非 JVM 堆),默认无上限(受物理内存限制) 4. 简化 HotSpot 代码,合并 JRockit 特性。元空间 GC 由类加载器触发。JVM,Java
28说一下 Kafka 中关于事务消息的实现?保证跨分区原子写入: 1. 事务协调器:每个 Producer 对应一个,管理事务状态 2. 事务ID:标识跨会话事务 3. 两阶段提交: - 发送消息到事务 Topic(未提交) - Commit:写事务结束标记到 __transaction_state 4. 消费者设置 isolation.level=read_committed 过滤未提交消息。Kafka,消息队列,后端
29MySQL 事务的二阶段提交是什么?用于保证 binlog 和 redo log 一致性: 1. Prepare 阶段:InnoDB 写 redo log(prepare 状态) 2. Commit 阶段: a. 写 binlog b. InnoDB 写 redo log(commit 状态) 崩溃恢复时:若 binlog 完整则提交事务,否则回滚。后端,MySQL,数据库
30说一下 RocketMQ 中关于事务消息的实现?半消息机制: 1. 生产者发送半消息(对消费者不可见) 2. Broker 持久化半消息,返回 ACK 3. 生产者执行本地事务 4. 根据本地事务结果提交/回滚: - 提交:消息可见,投递给消费者 - 回滚:删除消息 5. Broker 定时回查:若生产者未响应,回查事务状态。RocketMQ,后端,消息队列
31MySQL 中长事务可能会导致哪些问题?1. 锁竞争:持有锁时间长,阻塞其他事务 2. 回滚段膨胀:Undo Log 无法及时清理 3. 数据一致性风险:未提交修改对其他事务可见(取决于隔离级别) 4. 主从延迟:Binlog 需等待事务提交 5. 内存消耗:事务相关缓冲区无法释放。后端,MySQL,数据库
32RocketMQ 的事务消息有什么缺点?你还了解过别的事务消息实现吗?缺点: 1. 消息可见延迟(需等待本地事务结果) 2. 回查机制可能重复执行本地事务 3. 不保证全局事务一致性(需结合业务补偿) 其他实现: - Kafka 事务:基于生产者幂等和事务协调器 - 最大努力通知:通过异步重试保证最终一致。消息队列,后端,RocketMQ
33MySQL 中的 MVCC 是什么?多版本并发控制:通过数据快照实现非锁定读。InnoDB 实现方式: 1. 每行数据隐含 DB_TRX_ID(事务ID)和 DB_ROLL_PTR(回滚指针) 2. ReadView 结构:记录活跃事务ID列表,用于判断数据版本可见性 3. 快照读(如 SELECT)基于 ReadView 访问 Undo Log 中的历史版本。后端,MySQL,数据库
34为什么需要消息队列?核心价值: 1. 解耦:生产者和消费者独立演进 2. 异步:非必要操作异步执行,提升响应速度 3. 削峰:缓冲突发流量,保护下游系统 4. 可靠:消息持久化,确保不丢失 5. 扩展:通过分区水平扩展消费者。消息队列,后端
35MySQL 中的事务隔离级别有哪些?1. 读未提交(Read Uncommitted):可能脏读 2. 读已提交(Read Committed):避免脏读,可能不可重复读 3. 可重复读(Repeatable Read):避免脏读、不可重复读,可能幻读(InnoDB 通过 MVCC 部分避免) 4. 串行化(Serializable):强制事务串行执行。后端,MySQL,数据库
36说一下消息队列的模型有哪些?1. 点对点(Queue):消息被一个消费者消费 2. 发布/订阅(Topic):消息广播给所有订阅者 3. 增强模型: - Kafka 分区模型:同一分区内顺序消费 - RabbitMQ Exchange:Direct/Fanout/Topic/Headers 路由规则。消息队列,后端
37MySQL 默认的事务隔离级别是什么?为什么选择这个级别?默认级别:可重复读(Repeatable Read)。原因: 1. 平衡性能与一致性:避免脏读和不可重复读 2. InnoDB 通过 MVCC 和 Next-Key Lock 减少幻读 3. 适合多数业务场景(如账户余额查询需结果稳定)。后端,MySQL,数据库
38谈谈你了解的最常见的几种设计模式,说说他们的应用场景1. 单例模式(全局唯一实例):配置管理、线程池 2. 工厂模式(解耦创建逻辑):Spring BeanFactory 3. 代理模式(控制访问):AOP 切面、RPC 动态代理 4. 观察者模式(事件通知):GUI 事件、消息队列 5. 策略模式(算法切换):支付方式选择、排序算法切换。设计模式
39MySQL 中有哪些锁类型?按粒度: 1. 表锁:MyISAM 默认,开销小但并发低 2. 行锁:InnoDB 默认,分记录锁(锁定单行)、间隙锁(锁定范围)、临键锁(记录+间隙) 按行为:共享锁(S 锁,读锁)、排他锁(X 锁,写锁)、意向锁(IS/IX)。后端,MySQL,数据库
40什么是策略模式?一般用在什么场景?定义:封装可互换的算法族,使它们独立于客户端变化。场景: 1. 支付方式选择(支付宝/微信/银行卡) 2. 排序算法切换(快速/归并/堆排序) 3. 折扣策略(满减/折扣率/立减)。设计模式
41MySQL 的乐观锁和悲观锁是什么?悲观锁:假定冲突高,先加锁再操作(SELECT … FOR UPDATE) 乐观锁:假定冲突低,通过版本号/时间戳校验(UPDATE … SET version=new_version WHERE version=old_version),失败重试。后端,MySQL,数据库
42什么是责任链模式?一般用在什么场景?定义:多个处理器依次处理请求,每个处理器决定是否传递给下一个。场景: 1. 过滤器链(Servlet Filter) 2. 审批流程(经理→总监→CEO) 3. 异常处理(逐级捕获)。设计模式
43MySQL 中如果发生死锁应该如何解决?1. 设置 innodb_deadlock_detect=on(自动检测,默认开启) 2. InnoDB 自动回滚代价较小

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/91175.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/91175.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/91175.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenCV探索之旅:多尺度视觉与形状的灵魂--图像金字塔与轮廓分析

在我们学会用Canny算法勾勒处世界的轮廓之后,一个更深层次的问题摆在了面前:这些由像素组成的线条,如何才能被赋予“生命”,成为我们能够理解和分析的“形状”?如果一个物体在图像中时大时小,我们又该如何稳…

Redis作缓存时存在的问题及其解决方案

Redis最常用的一个场景就是作为缓存,本文主要探讨Redis作为缓存,在实践中可能会有哪些问题?比如一致性, 穿击, 穿透, 雪崩, 污染等。 为什么要理解Redis缓存问题 在高并发的业务场景下,数据库大多数情况都是用户并发访问最薄弱的…

day17 力扣654.最大二叉树 力扣617.合并二叉树 力扣700.二叉搜索树中的搜索 力扣98.验证二叉搜索树

最大二叉树给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建:创建一个根节点,其值为 nums 中的最大值。递归地在最大值 左边 的 子数组前缀上 构建左子树。递归地在最大值 右边 的 子数组后缀上 构建右子树。返回 nums 构建的 最大…

天地图前端实现geoJson与wkt格式互转

geoJson与wkt都是WebGIS开发中经常用到的格式,天地图行政区划边界接口返回的是wkt格式数据,需要转换一下。 安装插件:terraformer/wkt npm install terraformer/wkt 两个函数: .wktToGeoJSON(WKT) ⇒ object.geojsonToWKT(Geo…

(1-7-3)数据库的基本查询

目录 1. 数据库的基本查询 1.1 简单的记录查询 1.2 使用列别名 2. 数据分页查询 (1)查询前五行数据 (2)查询 11 ~ 15 行数据 3. 结果集排序 3.1 单关键字排序 (1)升序排列 (2&#…

宝塔配置pgsql可以远程访问及pdo_pgsql扩展的安装

本地navicat premium 17.0 可以远程访问pgsql v16.1宝塔的软件商店里,找到pgsql管理器;在pgsql管理器里找到客户端认证:第二步:配置修改,CtrlF 查找listen_addresses关键字;第三步:在navicat里配…

SQL进阶:自连接的用法

目录 一、可重排列、排列、组合 1、创建表 2、录入数据 3、获取可重排列的商品名称(有序) 4、获取排列的商品名称(有序) 5、获取组合的商品名称(无序) 6、获取3个元素的组合商品名称(无序…

Spark集群优化配置指南

Spark集群优化配置指南 📋 概述 本文档记录了5节点Spark集群的性能优化配置,主要解决Thrift Server内存不足(OOM)问题和CPU资源利用率低的问题。 文档内容 Spark架构原理: Driver与Executor的关系和工作机制Driver内存配置详解: 三个关键内存参数的作用和…

Layui —— select

前言:记录在修改bug时遇到的一些奇怪问题。遇到的奇怪问题1:项目中引入了 layui,而且也使用了 layui.use 按需导入了需要的组件,但是在页面每次刚初始化的时候去使用layui,控制台都会报 组件未定义的问题(正…

代码随想录day32dp1

文章目录509. 斐波那契数70. 爬楼梯746. 使用最小花费爬楼梯确定dp数组(dp table)以及下标的含义 确定递推公式 dp数组如何初始化 确定遍历顺序 举例推导dp数组509. 斐波那契数 题目链接 文章讲解 class Solution { public:int fib(int n) {// 1. 确定…

RedisJSON 技术揭秘`JSON.ARRTRIM`用窗口裁剪,让数组保持“刚刚好”

1、指令速查 JSON.ARRTRIM <key> <path> <start> <stop>key&#xff1a;Redis 键名path&#xff1a;JSONPath&#xff0c;默认 $ 根&#xff1b;可用 .[*]/.. 多路径匹配start / stop&#xff1a;要保留的 [start, stop] 闭区间索引 支持负值&#xff…

fpga调试经验

fpga调试经验 调测场景&#xff1a; 外接adc传感器芯片&#xff0c;采集压力&#xff0c;温度等模拟量&#xff0c;fpga通过spi/i2c接口与adc传感器芯片通信 问题1&#xff1a;adc芯片在稳定环境中&#xff0c;输出数字量不稳定。 结论&#xff1a;adc输入电压由fpga板供应&…

cefSharp.WinForms.NETCore 138.xx (cef138/Chromium 138.0.7204.97) 升级测试体验

一、版本说明及变化 该版本支持cef138.0.x系列,cefsharp138.0.170 无重大更新;该版本暂不支持h264,请关注后续 关注栏目,关注我,学习cefsharp少走弯路 不迷路! CefSharp 设置缓存的注意事项参考 说明:栏目是订阅文章,无附件,如需要单独获取(看底部介绍说明) 该版本1…

chatgpt是怎么诞生的,详解GPT1到GPT4的演化之路及相关背景知识

人工智能革命正在发生&#xff0c;我们是何其幸运的一代&#xff0c;能亲眼见证人类/机器智能的大爆发。 仅仅作为这场革命的看客显然是有些遗憾的&#xff0c;如何进一步了解它&#xff1f; 本文将讨论chatgpt的诞生过程&#xff0c;串联起OpenAI发表的一系列重要论文&#…

[笔记] 动态 SQL 查询技术解析:构建灵活高效的企业级数据访问层

文章目录一. 应用场景二. 使用示例示例1示例2示例3三. 实现1. 动态表查询构建器&#xff0c;模仿MyBatis-Plus2. mapper3. mapper.xml功能概述参数说明四. 动态 SQL 的优化与风险防控在企业级应用开发中&#xff0c;数据查询场景往往呈现出复杂多变的特点 —— 从简单的单表筛选…

.net天擎分钟降水数据统计

1.需求&#xff1a;计算滑动时间下的1小时、3小时、6小时、12小时、24小时降水数据&#xff0c;统计这个时间下的分钟级降水数据2.分析第一版本&#xff1a;降水分钟级数据保存时间不长&#xff0c;保存太多意义不大&#xff0c;以更新的形式来保存这些统计数据效果会比较好&am…

图片合并pdf

文章目录 背景目标实现下载 背景 整合&#xff1a; 将零散的图片集合成一个单一文件。有序化&#xff1a; 固定图片的排列顺序。标准化&#xff1a; 转换为通用、兼容性强的PDF格式。高效管理&#xff1a; 便于存储、查找、分享和传输。正式化/文档化&#xff1a; 满足提交、报…

【vue3+js】文件下载方法整理

前端文件下载方式 引言 在前端开发中,文件下载是一个常见的需求。后端可能以不同的方式返回文件数据,前端需要根据不同的返回类型采用相应的处理方式。本文将总结几种常见的后端返回类型及对应的前端处理方案,主要基于Vue3和JavaScript环境。 一、后端返回文件URL 场景描…

MicrobiomeStatPlots | 森林图教程Forest plot tutorial

视频讲解https://www.bilibili.com/video/BV1mA3yzEEnc/森林图简介什么是森林图&#xff1f;参考&#xff1a;https://mp.weixin.qq.com/s/vwNf_sFlmhp7DeSYaQ3NxQ森林图是以统计指标和统计分析方法为基础&#xff0c;用数值运算结果绘制出的图形。它在平面直角坐标系中&#x…

vscode 打开项目时候,有部分外部依赖包找不到定义或者声明,但是能使用cmake正常编译并且运行

解决&#xff1a;是依赖路径的问题&#xff0c;先看includePath对不对&#xff0c;但是有时候会依赖外部文件&#xff0c;这时候入股cmake编译能够听过&#xff0c; 说明编译器能够找到依赖路径&#xff0c; 但是vscode的 IntelliSense 找不到依赖路径 → 导致编辑器提示错误、…