<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>面试 on 吾爱主机</title><link>https://blog.waihost.com/tags/%E9%9D%A2%E8%AF%95/</link><description>Recent content in 面试 on 吾爱主机</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Thu, 25 Jun 2026 10:05:00 +0000</lastBuildDate><atom:link href="https://blog.waihost.com/tags/%E9%9D%A2%E8%AF%95/index.xml" rel="self" type="application/rss+xml"/><item><title>2025 Java MySQL 面试高频题汇总</title><link>https://blog.waihost.com/posts/java-mysql-interview-2025/</link><pubDate>Thu, 25 Jun 2026 10:05:00 +0000</pubDate><guid>https://blog.waihost.com/posts/java-mysql-interview-2025/</guid><description>&lt;img src="https://blog.waihost.com/images/covers/java-mysql-interview-2025.svg" alt="Featured image of post 2025 Java MySQL 面试高频题汇总" /&gt;&lt;h2 id="前言"&gt;&lt;a href="#%e5%89%8d%e8%a8%80" class="header-anchor"&gt;&lt;/a&gt;前言
&lt;/h2&gt;&lt;p&gt;本文整理了 2025 年 Java 后端开发面试中 MySQL 相关的高频考点，涵盖索引优化、事务隔离、锁机制、SQL 调优等核心内容，帮助候选人系统复习、高效备战。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="一mysql-索引相关"&gt;&lt;a href="#%e4%b8%80mysql-%e7%b4%a2%e5%bc%95%e7%9b%b8%e5%85%b3" class="header-anchor"&gt;&lt;/a&gt;一、MySQL 索引相关
&lt;/h2&gt;&lt;h3 id="11-为什么-mysql-使用-b-树而不是-b-树"&gt;&lt;a href="#11-%e4%b8%ba%e4%bb%80%e4%b9%88-mysql-%e4%bd%bf%e7%94%a8-b-%e6%a0%91%e8%80%8c%e4%b8%8d%e6%98%af-b-%e6%a0%91" class="header-anchor"&gt;&lt;/a&gt;1.1 为什么 MySQL 使用 B+ 树而不是 B 树？
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;B+ 树&lt;/strong&gt;叶子节点形成有序链表，范围查询效率更高&lt;/li&gt;
&lt;li&gt;非叶子节点只存储索引，单个页能容纳更多索引，树高更矮，IO 次数更少&lt;/li&gt;
&lt;li&gt;所有查询都落到叶子节点，查询性能稳定&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="12-聚簇索引和非聚簇索引的区别"&gt;&lt;a href="#12-%e8%81%9a%e7%b0%87%e7%b4%a2%e5%bc%95%e5%92%8c%e9%9d%9e%e8%81%9a%e7%b0%87%e7%b4%a2%e5%bc%95%e7%9a%84%e5%8c%ba%e5%88%ab" class="header-anchor"&gt;&lt;/a&gt;1.2 聚簇索引和非聚簇索引的区别？
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;特性&lt;/th&gt;
					&lt;th&gt;聚簇索引&lt;/th&gt;
					&lt;th&gt;非聚簇索引（二级索引）&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;数据存储&lt;/td&gt;
					&lt;td&gt;叶子节点存储完整数据行&lt;/td&gt;
					&lt;td&gt;叶子节点存储主键值&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;查询方式&lt;/td&gt;
					&lt;td&gt;直接获取数据&lt;/td&gt;
					&lt;td&gt;需要回表查询&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;数量限制&lt;/td&gt;
					&lt;td&gt;一张表只有一个&lt;/td&gt;
					&lt;td&gt;可以有多个&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="13-什么是覆盖索引"&gt;&lt;a href="#13-%e4%bb%80%e4%b9%88%e6%98%af%e8%a6%86%e7%9b%96%e7%b4%a2%e5%bc%95" class="header-anchor"&gt;&lt;/a&gt;1.3 什么是覆盖索引？
&lt;/h3&gt;&lt;p&gt;覆盖索引是指查询的列全部在索引中，不需要回表查询主键索引就能获取数据，显著提升查询性能。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- 假设有联合索引 idx_name_age(name, age)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;user&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;WHERE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;张三&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- 此查询走覆盖索引，无需回表
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="14-索引失效的常见场景"&gt;&lt;a href="#14-%e7%b4%a2%e5%bc%95%e5%a4%b1%e6%95%88%e7%9a%84%e5%b8%b8%e8%a7%81%e5%9c%ba%e6%99%af" class="header-anchor"&gt;&lt;/a&gt;1.4 索引失效的常见场景
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;使用 &lt;code&gt;LIKE '%xxx'&lt;/code&gt; 左模糊查询&lt;/li&gt;
&lt;li&gt;对索引列使用函数或表达式&lt;/li&gt;
&lt;li&gt;隐式类型转换&lt;/li&gt;
&lt;li&gt;使用 &lt;code&gt;OR&lt;/code&gt; 连接非索引列&lt;/li&gt;
&lt;li&gt;联合索引未遵循最左前缀原则&lt;/li&gt;
&lt;li&gt;&lt;code&gt;NOT IN&lt;/code&gt;、&lt;code&gt;NOT EXISTS&lt;/code&gt;、&lt;code&gt;!=&lt;/code&gt;、&lt;code&gt;&amp;lt;&amp;gt;&lt;/code&gt; 可能导致失效&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="二事务与隔离级别"&gt;&lt;a href="#%e4%ba%8c%e4%ba%8b%e5%8a%a1%e4%b8%8e%e9%9a%94%e7%a6%bb%e7%ba%a7%e5%88%ab" class="header-anchor"&gt;&lt;/a&gt;二、事务与隔离级别
&lt;/h2&gt;&lt;h3 id="21-事务的-acid-特性"&gt;&lt;a href="#21-%e4%ba%8b%e5%8a%a1%e7%9a%84-acid-%e7%89%b9%e6%80%a7" class="header-anchor"&gt;&lt;/a&gt;2.1 事务的 ACID 特性
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;A（原子性）&lt;/strong&gt;：undo log 实现，事务要么全部成功，要么全部回滚&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;C（一致性）&lt;/strong&gt;：由其他三个特性共同保证&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;I（隔离性）&lt;/strong&gt;：锁机制 + MVCC 实现&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;D（持久性）&lt;/strong&gt;：redo log 实现&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="22-四种隔离级别"&gt;&lt;a href="#22-%e5%9b%9b%e7%a7%8d%e9%9a%94%e7%a6%bb%e7%ba%a7%e5%88%ab" class="header-anchor"&gt;&lt;/a&gt;2.2 四种隔离级别
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;隔离级别&lt;/th&gt;
					&lt;th&gt;脏读&lt;/th&gt;
					&lt;th&gt;不可重复读&lt;/th&gt;
					&lt;th&gt;幻读&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;READ UNCOMMITTED&lt;/td&gt;
					&lt;td&gt;✓&lt;/td&gt;
					&lt;td&gt;✓&lt;/td&gt;
					&lt;td&gt;✓&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;READ COMMITTED&lt;/td&gt;
					&lt;td&gt;✗&lt;/td&gt;
					&lt;td&gt;✓&lt;/td&gt;
					&lt;td&gt;✓&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;REPEATABLE READ（默认）&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;✗&lt;/td&gt;
					&lt;td&gt;✗&lt;/td&gt;
					&lt;td&gt;✗*&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;SERIALIZABLE&lt;/td&gt;
					&lt;td&gt;✗&lt;/td&gt;
					&lt;td&gt;✗&lt;/td&gt;
					&lt;td&gt;✗&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;

 &lt;blockquote&gt;
 &lt;p&gt;InnoDB 在 RR 级别下通过 MVCC + Next-Key Lock 解决了大部分幻读问题。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="23-mvcc-实现原理"&gt;&lt;a href="#23-mvcc-%e5%ae%9e%e7%8e%b0%e5%8e%9f%e7%90%86" class="header-anchor"&gt;&lt;/a&gt;2.3 MVCC 实现原理
&lt;/h3&gt;&lt;p&gt;MVCC（多版本并发控制）通过以下机制实现：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;隐藏列&lt;/strong&gt;：每行数据包含 &lt;code&gt;DB_TRX_ID&lt;/code&gt;（事务ID）、&lt;code&gt;DB_ROLL_PTR&lt;/code&gt;（回滚指针）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;undo log&lt;/strong&gt;：形成版本链&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Read View&lt;/strong&gt;：根据事务启动时机判断可见性&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;RC 与 RR 的区别&lt;/strong&gt;：RC 每次查询生成新的 Read View，RR 只在事务第一次查询时生成。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="三锁机制"&gt;&lt;a href="#%e4%b8%89%e9%94%81%e6%9c%ba%e5%88%b6" class="header-anchor"&gt;&lt;/a&gt;三、锁机制
&lt;/h2&gt;&lt;h3 id="31-innodb-锁类型"&gt;&lt;a href="#31-innodb-%e9%94%81%e7%b1%bb%e5%9e%8b" class="header-anchor"&gt;&lt;/a&gt;3.1 InnoDB 锁类型
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;共享锁（S Lock）&lt;/strong&gt;：读锁，多个事务可共享&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;排他锁（X Lock）&lt;/strong&gt;：写锁，互斥&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;意向锁（IS/IX）&lt;/strong&gt;：表级锁，标识事务意图&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;间隙锁（Gap Lock）&lt;/strong&gt;：锁定索引间隙，防止幻读&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;临键锁（Next-Key Lock）&lt;/strong&gt;：记录锁 + 间隙锁，左开右闭区间&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="32-死锁如何产生和解决"&gt;&lt;a href="#32-%e6%ad%bb%e9%94%81%e5%a6%82%e4%bd%95%e4%ba%a7%e7%94%9f%e5%92%8c%e8%a7%a3%e5%86%b3" class="header-anchor"&gt;&lt;/a&gt;3.2 死锁如何产生和解决？
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;产生条件&lt;/strong&gt;：两个或多个事务互相等待对方持有的锁。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;排查方法&lt;/strong&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;SHOW&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ENGINE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;INNODB&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;STATUS&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;-- 查看最近死锁信息
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;information_schema&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;INNODB_TRX&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;-- 查看当前事务
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;解决方案&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;按固定顺序访问表和行&lt;/li&gt;
&lt;li&gt;大事务拆小事务&lt;/li&gt;
&lt;li&gt;设置合理的锁等待超时 &lt;code&gt;innodb_lock_wait_timeout&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;使用低隔离级别（业务允许时）&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="四sql-优化"&gt;&lt;a href="#%e5%9b%9bsql-%e4%bc%98%e5%8c%96" class="header-anchor"&gt;&lt;/a&gt;四、SQL 优化
&lt;/h2&gt;&lt;h3 id="41-explain-执行计划关键字段"&gt;&lt;a href="#41-explain-%e6%89%a7%e8%a1%8c%e8%ae%a1%e5%88%92%e5%85%b3%e9%94%ae%e5%ad%97%e6%ae%b5" class="header-anchor"&gt;&lt;/a&gt;4.1 EXPLAIN 执行计划关键字段
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;EXPLAIN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;user&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;WHERE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;张三&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;重点关注字段：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;type&lt;/strong&gt;：访问类型，性能从好到差 &lt;code&gt;system &amp;gt; const &amp;gt; eq_ref &amp;gt; ref &amp;gt; range &amp;gt; index &amp;gt; ALL&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;key&lt;/strong&gt;：实际使用的索引&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;rows&lt;/strong&gt;：预估扫描行数&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Extra&lt;/strong&gt;：&lt;code&gt;Using index&lt;/code&gt;（覆盖索引）、&lt;code&gt;Using filesort&lt;/code&gt;（文件排序）、&lt;code&gt;Using temporary&lt;/code&gt;（临时表）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="42-慢查询优化思路"&gt;&lt;a href="#42-%e6%85%a2%e6%9f%a5%e8%af%a2%e4%bc%98%e5%8c%96%e6%80%9d%e8%b7%af" class="header-anchor"&gt;&lt;/a&gt;4.2 慢查询优化思路
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;开启慢查询日志定位问题 SQL&lt;/li&gt;
&lt;li&gt;使用 EXPLAIN 分析执行计划&lt;/li&gt;
&lt;li&gt;合理添加索引（遵循最左前缀原则）&lt;/li&gt;
&lt;li&gt;避免 &lt;code&gt;SELECT *&lt;/code&gt;，只查询需要的列&lt;/li&gt;
&lt;li&gt;分页优化：深分页使用延迟关联&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- 深分页优化：先查主键再关联
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;user&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;INNER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;JOIN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;user&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;ORDER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;BY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;LIMIT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1000000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;ON&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="43-join-优化"&gt;&lt;a href="#43-join-%e4%bc%98%e5%8c%96" class="header-anchor"&gt;&lt;/a&gt;4.3 JOIN 优化
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;小表驱动大表&lt;/li&gt;
&lt;li&gt;被驱动表关联字段加索引&lt;/li&gt;
&lt;li&gt;避免 &lt;code&gt;LEFT JOIN&lt;/code&gt; 时 ON 条件使用 &lt;code&gt;OR&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="五mysql-架构"&gt;&lt;a href="#%e4%ba%94mysql-%e6%9e%b6%e6%9e%84" class="header-anchor"&gt;&lt;/a&gt;五、MySQL 架构
&lt;/h2&gt;&lt;h3 id="51-innodb-架构核心组件"&gt;&lt;a href="#51-innodb-%e6%9e%b6%e6%9e%84%e6%a0%b8%e5%bf%83%e7%bb%84%e4%bb%b6" class="header-anchor"&gt;&lt;/a&gt;5.1 InnoDB 架构核心组件
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Buffer Pool&lt;/strong&gt;：缓存数据页和索引页&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Change Buffer&lt;/strong&gt;：缓存非唯一二级索引的写操作&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Log Buffer&lt;/strong&gt;：缓存 redo log&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;redo log&lt;/strong&gt;：保证事务持久性（WAL 机制）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;undo log&lt;/strong&gt;：保证事务原子性，支持 MVCC&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="52-binlogredo-logundo-log-区别"&gt;&lt;a href="#52-binlogredo-logundo-log-%e5%8c%ba%e5%88%ab" class="header-anchor"&gt;&lt;/a&gt;5.2 binlog、redo log、undo log 区别
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;特性&lt;/th&gt;
					&lt;th&gt;binlog&lt;/th&gt;
					&lt;th&gt;redo log&lt;/th&gt;
					&lt;th&gt;undo log&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;层级&lt;/td&gt;
					&lt;td&gt;Server 层&lt;/td&gt;
					&lt;td&gt;InnoDB 引擎&lt;/td&gt;
					&lt;td&gt;InnoDB 引擎&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;内容&lt;/td&gt;
					&lt;td&gt;逻辑日志&lt;/td&gt;
					&lt;td&gt;物理日志&lt;/td&gt;
					&lt;td&gt;逻辑日志&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;作用&lt;/td&gt;
					&lt;td&gt;主从复制、数据恢复&lt;/td&gt;
					&lt;td&gt;崩溃恢复&lt;/td&gt;
					&lt;td&gt;事务回滚、MVCC&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;写入方式&lt;/td&gt;
					&lt;td&gt;追加写入&lt;/td&gt;
					&lt;td&gt;循环写入&lt;/td&gt;
					&lt;td&gt;追加写入&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="53-两阶段提交2pc"&gt;&lt;a href="#53-%e4%b8%a4%e9%98%b6%e6%ae%b5%e6%8f%90%e4%ba%a42pc" class="header-anchor"&gt;&lt;/a&gt;5.3 两阶段提交（2PC）
&lt;/h3&gt;&lt;p&gt;为了保证 binlog 和 redo log 的一致性：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;prepare 阶段&lt;/strong&gt;：redo log 写入磁盘，标记为 prepare&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;commit 阶段&lt;/strong&gt;：binlog 写入磁盘后，redo log 标记为 commit&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="六高频场景题"&gt;&lt;a href="#%e5%85%ad%e9%ab%98%e9%a2%91%e5%9c%ba%e6%99%af%e9%a2%98" class="header-anchor"&gt;&lt;/a&gt;六、高频场景题
&lt;/h2&gt;&lt;h3 id="61-分库分表方案"&gt;&lt;a href="#61-%e5%88%86%e5%ba%93%e5%88%86%e8%a1%a8%e6%96%b9%e6%a1%88" class="header-anchor"&gt;&lt;/a&gt;6.1 分库分表方案
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;垂直分库&lt;/strong&gt;：按业务拆分（订单库、用户库）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;水平分表&lt;/strong&gt;：按行拆分（取模、范围、时间）&lt;/li&gt;
&lt;li&gt;常用中间件：ShardingSphere、MyCat&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="62-如何设计一个高并发的秒杀数据库方案"&gt;&lt;a href="#62-%e5%a6%82%e4%bd%95%e8%ae%be%e8%ae%a1%e4%b8%80%e4%b8%aa%e9%ab%98%e5%b9%b6%e5%8f%91%e7%9a%84%e7%a7%92%e6%9d%80%e6%95%b0%e6%8d%ae%e5%ba%93%e6%96%b9%e6%a1%88" class="header-anchor"&gt;&lt;/a&gt;6.2 如何设计一个高并发的秒杀数据库方案？
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;热点数据缓存到 Redis&lt;/li&gt;
&lt;li&gt;库存扣减使用 Redis 原子操作预扣&lt;/li&gt;
&lt;li&gt;订单写入异步队列&lt;/li&gt;
&lt;li&gt;数据库层面乐观锁更新&lt;/li&gt;
&lt;li&gt;分库分表减少单表压力&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- 乐观锁扣减库存
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;UPDATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;goods&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;SET&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;stock&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;stock&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;WHERE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1001&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AND&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;stock&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="总结"&gt;&lt;a href="#%e6%80%bb%e7%bb%93" class="header-anchor"&gt;&lt;/a&gt;总结
&lt;/h2&gt;&lt;p&gt;2025 年 Java MySQL 面试依然围绕 &lt;strong&gt;索引原理&lt;/strong&gt;、&lt;strong&gt;事务隔离&lt;/strong&gt;、&lt;strong&gt;锁机制&lt;/strong&gt;、&lt;strong&gt;SQL 优化&lt;/strong&gt; 四大核心主题展开。理解底层原理比死记硬背更重要，建议结合源码和实际项目经验深入学习。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;推荐书籍：《高性能 MySQL》《MySQL 技术内幕：InnoDB 存储引擎》&lt;/p&gt;

 &lt;/blockquote&gt;</description></item><item><title>2025 前端面试题大全</title><link>https://blog.waihost.com/posts/frontend-interview-2025/</link><pubDate>Thu, 25 Jun 2026 10:00:00 +0000</pubDate><guid>https://blog.waihost.com/posts/frontend-interview-2025/</guid><description>&lt;img src="https://blog.waihost.com/images/covers/frontend-interview-2025.svg" alt="Featured image of post 2025 前端面试题大全" /&gt;&lt;h2 id="前言"&gt;&lt;a href="#%e5%89%8d%e8%a8%80" class="header-anchor"&gt;&lt;/a&gt;前言
&lt;/h2&gt;&lt;p&gt;2025 年前端技术持续演进，面试题目也在不断更新。本文整理了最新的前端面试高频题目，涵盖 JavaScript 基础、框架原理、性能优化、工程化等核心领域，帮助大家系统备战面试。&lt;/p&gt;
&lt;h2 id="一javascript-基础"&gt;&lt;a href="#%e4%b8%80javascript-%e5%9f%ba%e7%a1%80" class="header-anchor"&gt;&lt;/a&gt;一、JavaScript 基础
&lt;/h2&gt;&lt;h3 id="11-闭包的理解"&gt;&lt;a href="#11-%e9%97%ad%e5%8c%85%e7%9a%84%e7%90%86%e8%a7%a3" class="header-anchor"&gt;&lt;/a&gt;1.1 闭包的理解
&lt;/h3&gt;&lt;p&gt;闭包是指函数能够访问其词法作用域中变量的能力，即使该函数在其词法作用域之外执行。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;createCounter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;createCounter&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt; &lt;span class="c1"&gt;// 1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt; &lt;span class="c1"&gt;// 2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;闭包的常见应用场景：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;数据封装和私有变量&lt;/li&gt;
&lt;li&gt;函数工厂&lt;/li&gt;
&lt;li&gt;回调函数和事件处理&lt;/li&gt;
&lt;li&gt;柯里化（Currying）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="12-原型链与继承"&gt;&lt;a href="#12-%e5%8e%9f%e5%9e%8b%e9%93%be%e4%b8%8e%e7%bb%a7%e6%89%bf" class="header-anchor"&gt;&lt;/a&gt;1.2 原型链与继承
&lt;/h3&gt;&lt;p&gt;每个对象都有一个 &lt;code&gt;__proto__&lt;/code&gt; 指向其构造函数的 &lt;code&gt;prototype&lt;/code&gt;，形成原型链。当访问对象属性时，会沿着原型链向上查找。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;Animal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;Animal&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;speak&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sb"&gt; makes a noise.`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;Dog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;Animal&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;Dog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Animal&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;Dog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;constructor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Dog&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="13-promise-与-asyncawait"&gt;&lt;a href="#13-promise-%e4%b8%8e-asyncawait" class="header-anchor"&gt;&lt;/a&gt;1.3 Promise 与 async/await
&lt;/h3&gt;&lt;p&gt;Promise 是异步编程的解决方案，async/await 是其语法糖。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;fetchData&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kr"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/api/data&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kr"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;请求失败:&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;手写 Promise.all 的核心思路：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;promiseAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;promises&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;reject&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;promises&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;val&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;results&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;val&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;promises&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;results&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="nx"&gt;reject&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="二css-核心知识"&gt;&lt;a href="#%e4%ba%8ccss-%e6%a0%b8%e5%bf%83%e7%9f%a5%e8%af%86" class="header-anchor"&gt;&lt;/a&gt;二、CSS 核心知识
&lt;/h2&gt;&lt;h3 id="21-bfc块级格式化上下文"&gt;&lt;a href="#21-bfc%e5%9d%97%e7%ba%a7%e6%a0%bc%e5%bc%8f%e5%8c%96%e4%b8%8a%e4%b8%8b%e6%96%87" class="header-anchor"&gt;&lt;/a&gt;2.1 BFC（块级格式化上下文）
&lt;/h3&gt;&lt;p&gt;BFC 是一个独立的渲染区域，内部元素的布局不会影响外部。触发条件：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;overflow&lt;/code&gt; 不为 &lt;code&gt;visible&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;display&lt;/code&gt; 为 &lt;code&gt;flex&lt;/code&gt;、&lt;code&gt;grid&lt;/code&gt;、&lt;code&gt;inline-block&lt;/code&gt; 等&lt;/li&gt;
&lt;li&gt;&lt;code&gt;position&lt;/code&gt; 为 &lt;code&gt;absolute&lt;/code&gt; 或 &lt;code&gt;fixed&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;float&lt;/code&gt; 不为 &lt;code&gt;none&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="22-flex-布局"&gt;&lt;a href="#22-flex-%e5%b8%83%e5%b1%80" class="header-anchor"&gt;&lt;/a&gt;2.2 Flex 布局
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;container&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;flex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;justify-content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;space-between&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;align-items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;flex-wrap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;wrap&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;gap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="kt"&gt;px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="23-css-变量与主题切换"&gt;&lt;a href="#23-css-%e5%8f%98%e9%87%8f%e4%b8%8e%e4%b8%bb%e9%a2%98%e5%88%87%e6%8d%a2" class="header-anchor"&gt;&lt;/a&gt;2.3 CSS 变量与主题切换
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nd"&gt;root&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;--primary-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mh"&gt;#1890ff&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;--bg-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mh"&gt;#ffffff&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;data-theme&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;dark&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;--primary-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mh"&gt;#177ddc&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;--bg-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mh"&gt;#141414&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="三vue-面试题"&gt;&lt;a href="#%e4%b8%89vue-%e9%9d%a2%e8%af%95%e9%a2%98" class="header-anchor"&gt;&lt;/a&gt;三、Vue 面试题
&lt;/h2&gt;&lt;h3 id="31-vue-3-响应式原理"&gt;&lt;a href="#31-vue-3-%e5%93%8d%e5%ba%94%e5%bc%8f%e5%8e%9f%e7%90%86" class="header-anchor"&gt;&lt;/a&gt;3.1 Vue 3 响应式原理
&lt;/h3&gt;&lt;p&gt;Vue 3 使用 &lt;code&gt;Proxy&lt;/code&gt; 替代了 Vue 2 的 &lt;code&gt;Object.defineProperty&lt;/code&gt;，解决了：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;无法检测对象属性的添加和删除&lt;/li&gt;
&lt;li&gt;无法检测数组索引和长度的变化&lt;/li&gt;
&lt;li&gt;性能更好，不需要递归遍历所有属性&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;reactive&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nb"&gt;Proxy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;receiver&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;track&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 依赖收集
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;Reflect&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;receiver&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;receiver&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Reflect&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;receiver&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;trigger&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 触发更新
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="32-vue-3-composition-api-优势"&gt;&lt;a href="#32-vue-3-composition-api-%e4%bc%98%e5%8a%bf" class="header-anchor"&gt;&lt;/a&gt;3.2 Vue 3 Composition API 优势
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;更好的逻辑复用（Composables）&lt;/li&gt;
&lt;li&gt;更灵活的代码组织&lt;/li&gt;
&lt;li&gt;更好的类型推导&lt;/li&gt;
&lt;li&gt;更小的打包体积（tree-shaking）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="33-虚拟-dom-与-diff-算法"&gt;&lt;a href="#33-%e8%99%9a%e6%8b%9f-dom-%e4%b8%8e-diff-%e7%ae%97%e6%b3%95" class="header-anchor"&gt;&lt;/a&gt;3.3 虚拟 DOM 与 Diff 算法
&lt;/h3&gt;&lt;p&gt;Vue 的 Diff 算法核心策略：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;同层比较，不跨层级&lt;/li&gt;
&lt;li&gt;同节点类型才进行比较&lt;/li&gt;
&lt;li&gt;使用 &lt;code&gt;key&lt;/code&gt; 优化列表对比&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Vue 3 引入了最长递增子序列算法优化节点移动。&lt;/p&gt;
&lt;h2 id="四react-面试题"&gt;&lt;a href="#%e5%9b%9breact-%e9%9d%a2%e8%af%95%e9%a2%98" class="header-anchor"&gt;&lt;/a&gt;四、React 面试题
&lt;/h2&gt;&lt;h3 id="41-react-fiber-架构"&gt;&lt;a href="#41-react-fiber-%e6%9e%b6%e6%9e%84" class="header-anchor"&gt;&lt;/a&gt;4.1 React Fiber 架构
&lt;/h3&gt;&lt;p&gt;Fiber 是 React 16 引入的协调引擎，核心特点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;可中断渲染&lt;/strong&gt;：将渲染工作拆分为小单元&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;优先级调度&lt;/strong&gt;：高优先级更新可以打断低优先级&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;双缓存树&lt;/strong&gt;：current 树和 workInProgress 树&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="42-hooks-原理"&gt;&lt;a href="#42-hooks-%e5%8e%9f%e7%90%86" class="header-anchor"&gt;&lt;/a&gt;4.2 Hooks 原理
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 简化版 useState 实现
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;hookStates&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;hookIndex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;initialState&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;hookStates&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;hookIndex&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;hookStates&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;hookIndex&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;initialState&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;currentIndex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;hookIndex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;setState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;newState&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;hookStates&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;currentIndex&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;newState&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;render&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// 触发重新渲染
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;hookStates&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;hookIndex&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nx"&gt;setState&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="43-react-性能优化"&gt;&lt;a href="#43-react-%e6%80%a7%e8%83%bd%e4%bc%98%e5%8c%96" class="header-anchor"&gt;&lt;/a&gt;4.3 React 性能优化
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;React.memo&lt;/code&gt; / &lt;code&gt;useMemo&lt;/code&gt; / &lt;code&gt;useCallback&lt;/code&gt; 避免不必要的渲染&lt;/li&gt;
&lt;li&gt;虚拟列表优化长列表&lt;/li&gt;
&lt;li&gt;代码分割与懒加载&lt;/li&gt;
&lt;li&gt;状态下沉，减少不必要的全局状态&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="五工程化与构建工具"&gt;&lt;a href="#%e4%ba%94%e5%b7%a5%e7%a8%8b%e5%8c%96%e4%b8%8e%e6%9e%84%e5%bb%ba%e5%b7%a5%e5%85%b7" class="header-anchor"&gt;&lt;/a&gt;五、工程化与构建工具
&lt;/h2&gt;&lt;h3 id="51-vite-vs-webpack"&gt;&lt;a href="#51-vite-vs-webpack" class="header-anchor"&gt;&lt;/a&gt;5.1 Vite vs Webpack
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;特性&lt;/th&gt;
					&lt;th&gt;Vite&lt;/th&gt;
					&lt;th&gt;Webpack&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;开发启动&lt;/td&gt;
					&lt;td&gt;极快（ESM 原生加载）&lt;/td&gt;
					&lt;td&gt;较慢（打包后启动）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;热更新&lt;/td&gt;
					&lt;td&gt;毫秒级&lt;/td&gt;
					&lt;td&gt;秒级&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;生产构建&lt;/td&gt;
					&lt;td&gt;Rollup&lt;/td&gt;
					&lt;td&gt;自身打包&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;配置复杂度&lt;/td&gt;
					&lt;td&gt;低&lt;/td&gt;
					&lt;td&gt;高&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="52-模块化方案"&gt;&lt;a href="#52-%e6%a8%a1%e5%9d%97%e5%8c%96%e6%96%b9%e6%a1%88" class="header-anchor"&gt;&lt;/a&gt;5.2 模块化方案
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ESM&lt;/strong&gt;：标准模块方案，静态分析&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CJS&lt;/strong&gt;：Node.js 模块方案，运行时加载&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;UMD&lt;/strong&gt;：兼容多种模块系统&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AMD&lt;/strong&gt;：异步模块定义&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="53-monorepo-方案"&gt;&lt;a href="#53-monorepo-%e6%96%b9%e6%a1%88" class="header-anchor"&gt;&lt;/a&gt;5.3 Monorepo 方案
&lt;/h3&gt;&lt;p&gt;2025 年主流 Monorepo 工具：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;pnpm workspace&lt;/strong&gt;：高效磁盘利用&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Turborepo&lt;/strong&gt;：构建缓存与并行执行&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nx&lt;/strong&gt;：增量构建与依赖图分析&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="六性能优化"&gt;&lt;a href="#%e5%85%ad%e6%80%a7%e8%83%bd%e4%bc%98%e5%8c%96" class="header-anchor"&gt;&lt;/a&gt;六、性能优化
&lt;/h2&gt;&lt;h3 id="61-首屏性能优化"&gt;&lt;a href="#61-%e9%a6%96%e5%b1%8f%e6%80%a7%e8%83%bd%e4%bc%98%e5%8c%96" class="header-anchor"&gt;&lt;/a&gt;6.1 首屏性能优化
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;SSR / SSG 服务端渲染&lt;/li&gt;
&lt;li&gt;关键资源预加载（&lt;code&gt;&amp;lt;link rel=&amp;quot;preload&amp;quot;&amp;gt;&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;图片懒加载与现代格式（WebP、AVIF）&lt;/li&gt;
&lt;li&gt;代码分割与动态导入&lt;/li&gt;
&lt;li&gt;CDN 加速&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="62-运行时性能优化"&gt;&lt;a href="#62-%e8%bf%90%e8%a1%8c%e6%97%b6%e6%80%a7%e8%83%bd%e4%bc%98%e5%8c%96" class="header-anchor"&gt;&lt;/a&gt;6.2 运行时性能优化
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;防抖与节流&lt;/li&gt;
&lt;li&gt;Web Worker 处理耗时计算&lt;/li&gt;
&lt;li&gt;requestAnimationFrame 优化动画&lt;/li&gt;
&lt;li&gt;虚拟滚动优化长列表&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="63-core-web-vitals"&gt;&lt;a href="#63-core-web-vitals" class="header-anchor"&gt;&lt;/a&gt;6.3 Core Web Vitals
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;LCP（Largest Contentful Paint）&lt;/strong&gt;：&amp;lt; 2.5s&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;INP（Interaction to Next Paint）&lt;/strong&gt;：&amp;lt; 200ms&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CLS（Cumulative Layout Shift）&lt;/strong&gt;：&amp;lt; 0.1&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="七typescript"&gt;&lt;a href="#%e4%b8%83typescript" class="header-anchor"&gt;&lt;/a&gt;七、TypeScript
&lt;/h2&gt;&lt;h3 id="71-高级类型工具"&gt;&lt;a href="#71-%e9%ab%98%e7%ba%a7%e7%b1%bb%e5%9e%8b%e5%b7%a5%e5%85%b7" class="header-anchor"&gt;&lt;/a&gt;7.1 高级类型工具
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 条件类型
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;IsString&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;T&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt; &lt;span class="kr"&gt;extends&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 映射类型
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Readonly&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;T&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;readonly&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;P&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="k"&gt;keyof&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;P&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 模板字面量类型
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;EventName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sb"&gt;`on&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;Capitalize&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="72-typescript-体操"&gt;&lt;a href="#72-typescript-%e4%bd%93%e6%93%8d" class="header-anchor"&gt;&lt;/a&gt;7.2 TypeScript 体操
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 实现 DeepPartial
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;DeepPartial&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;T&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;P&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="k"&gt;keyof&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;?:&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;P&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="kr"&gt;extends&lt;/span&gt; &lt;span class="kt"&gt;object&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;DeepPartial&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;T&lt;/span&gt;&lt;span class="err"&gt;[&lt;/span&gt;&lt;span class="na"&gt;P&lt;/span&gt;&lt;span class="err"&gt;]&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;P&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 实现 ReturnType
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;MyReturnType&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;T&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt; &lt;span class="kr"&gt;extends&lt;/span&gt; &lt;span class="p"&gt;(...&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt;: &lt;span class="kt"&gt;any&lt;/span&gt;&lt;span class="p"&gt;[])&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;infer&lt;/span&gt; &lt;span class="nx"&gt;R&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;R&lt;/span&gt; : &lt;span class="kt"&gt;never&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="八网络与安全"&gt;&lt;a href="#%e5%85%ab%e7%bd%91%e7%bb%9c%e4%b8%8e%e5%ae%89%e5%85%a8" class="header-anchor"&gt;&lt;/a&gt;八、网络与安全
&lt;/h2&gt;&lt;h3 id="81-http3-与-quic"&gt;&lt;a href="#81-http3-%e4%b8%8e-quic" class="header-anchor"&gt;&lt;/a&gt;8.1 HTTP/3 与 QUIC
&lt;/h3&gt;&lt;p&gt;HTTP/3 基于 QUIC 协议，优势：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;0-RTT 连接建立&lt;/li&gt;
&lt;li&gt;多路复用无队头阻塞&lt;/li&gt;
&lt;li&gt;连接迁移（网络切换不断连）&lt;/li&gt;
&lt;li&gt;内置 TLS 1.3&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="82-前端安全"&gt;&lt;a href="#82-%e5%89%8d%e7%ab%af%e5%ae%89%e5%85%a8" class="header-anchor"&gt;&lt;/a&gt;8.2 前端安全
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;XSS 防护&lt;/strong&gt;：内容安全策略（CSP）、输入过滤、输出编码&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CSRF 防护&lt;/strong&gt;：SameSite Cookie、Token 验证&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;点击劫持&lt;/strong&gt;：X-Frame-Options、CSP frame-ancestors&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="总结"&gt;&lt;a href="#%e6%80%bb%e7%bb%93" class="header-anchor"&gt;&lt;/a&gt;总结
&lt;/h2&gt;&lt;p&gt;2025 年前端面试依然重视基础知识，同时对 TypeScript、性能优化、工程化能力的要求更高。建议系统学习原理，结合实际项目经验，才能在面试中脱颖而出。&lt;/p&gt;</description></item><item><title>2025 年 Java Spring 面试题精选</title><link>https://blog.waihost.com/posts/java-spring-interview-2025/</link><pubDate>Fri, 01 May 2026 14:00:00 +0000</pubDate><guid>https://blog.waihost.com/posts/java-spring-interview-2025/</guid><description>&lt;img src="https://blog.waihost.com/images/covers/java-spring-interview-2025.svg" alt="Featured image of post 2025 年 Java Spring 面试题精选" /&gt;&lt;h2 id="概述"&gt;&lt;a href="#%e6%a6%82%e8%bf%b0" class="header-anchor"&gt;&lt;/a&gt;概述
&lt;/h2&gt;&lt;p&gt;本文整理了 2025 年常见的 Java Spring 面试题，涵盖 Spring Core、Spring Boot、Spring MVC、Spring Cloud 等核心知识点，帮助开发者系统备战面试。&lt;/p&gt;
&lt;h2 id="一spring-core"&gt;&lt;a href="#%e4%b8%80spring-core" class="header-anchor"&gt;&lt;/a&gt;一、Spring Core
&lt;/h2&gt;&lt;h3 id="1-什么是-ioc控制反转"&gt;&lt;a href="#1-%e4%bb%80%e4%b9%88%e6%98%af-ioc%e6%8e%a7%e5%88%b6%e5%8f%8d%e8%bd%ac" class="header-anchor"&gt;&lt;/a&gt;1. 什么是 IoC（控制反转）？
&lt;/h3&gt;&lt;p&gt;IoC 是一种设计思想，将对象的创建和依赖管理交给 Spring 容器，而不是由开发者手动 &lt;code&gt;new&lt;/code&gt; 对象。Spring 通过依赖注入（DI）实现 IoC，降低了代码耦合度。&lt;/p&gt;
&lt;h3 id="2-spring-bean-的作用域有哪些"&gt;&lt;a href="#2-spring-bean-%e7%9a%84%e4%bd%9c%e7%94%a8%e5%9f%9f%e6%9c%89%e5%93%aa%e4%ba%9b" class="header-anchor"&gt;&lt;/a&gt;2. Spring Bean 的作用域有哪些？
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;作用域&lt;/th&gt;
					&lt;th&gt;说明&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;singleton&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;默认，整个容器中只有一个实例&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;prototype&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;每次请求创建一个新的实例&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;request&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;每次 HTTP 请求创建一个实例（Web 应用）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;session&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;每个 HTTP Session 创建一个实例&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;application&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;每个 ServletContext 创建一个实例&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="3-autowired-和-resource-的区别"&gt;&lt;a href="#3-autowired-%e5%92%8c-resource-%e7%9a%84%e5%8c%ba%e5%88%ab" class="header-anchor"&gt;&lt;/a&gt;3. @Autowired 和 @Resource 的区别？
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@Autowired&lt;/code&gt;：Spring 注解，默认按类型注入，可配合 &lt;code&gt;@Qualifier&lt;/code&gt; 按名称注入&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@Resource&lt;/code&gt;：JSR-250 注解，默认按名称注入，找不到再按类型注入&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="4-spring-bean-的生命周期"&gt;&lt;a href="#4-spring-bean-%e7%9a%84%e7%94%9f%e5%91%bd%e5%91%a8%e6%9c%9f" class="header-anchor"&gt;&lt;/a&gt;4. Spring Bean 的生命周期？
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;实例化 Bean&lt;/li&gt;
&lt;li&gt;属性注入（依赖注入）&lt;/li&gt;
&lt;li&gt;调用 &lt;code&gt;BeanNameAware&lt;/code&gt;、&lt;code&gt;BeanFactoryAware&lt;/code&gt; 等接口&lt;/li&gt;
&lt;li&gt;调用 &lt;code&gt;BeanPostProcessor#postProcessBeforeInitialization&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;调用 &lt;code&gt;@PostConstruct&lt;/code&gt; / &lt;code&gt;InitializingBean#afterPropertiesSet&lt;/code&gt; / &lt;code&gt;init-method&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;调用 &lt;code&gt;BeanPostProcessor#postProcessAfterInitialization&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Bean 就绪，可使用&lt;/li&gt;
&lt;li&gt;调用 &lt;code&gt;@PreDestroy&lt;/code&gt; / &lt;code&gt;DisposableBean#destroy&lt;/code&gt; / &lt;code&gt;destroy-method&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="二spring-boot"&gt;&lt;a href="#%e4%ba%8cspring-boot" class="header-anchor"&gt;&lt;/a&gt;二、Spring Boot
&lt;/h2&gt;&lt;h3 id="5-spring-boot-的核心优势"&gt;&lt;a href="#5-spring-boot-%e7%9a%84%e6%a0%b8%e5%bf%83%e4%bc%98%e5%8a%bf" class="header-anchor"&gt;&lt;/a&gt;5. Spring Boot 的核心优势？
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;自动配置&lt;/strong&gt;：根据引入的依赖自动配置 Bean&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;起步依赖&lt;/strong&gt;：简化 Maven/Gradle 依赖管理&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;内嵌服务器&lt;/strong&gt;：无需外部 Tomcat，直接 &lt;code&gt;java -jar&lt;/code&gt; 运行&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Actuator&lt;/strong&gt;：提供生产级监控端点&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="6-springbootapplication-注解的作用"&gt;&lt;a href="#6-springbootapplication-%e6%b3%a8%e8%a7%a3%e7%9a%84%e4%bd%9c%e7%94%a8" class="header-anchor"&gt;&lt;/a&gt;6. @SpringBootApplication 注解的作用？
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;@SpringBootApplication&lt;/code&gt; 是组合注解，包含：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@SpringBootConfiguration&lt;/code&gt;：标记为配置类&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@EnableAutoConfiguration&lt;/code&gt;：启用自动配置&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@ComponentScan&lt;/code&gt;：扫描当前包及子包的组件&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="7-spring-boot-自动配置原理"&gt;&lt;a href="#7-spring-boot-%e8%87%aa%e5%8a%a8%e9%85%8d%e7%bd%ae%e5%8e%9f%e7%90%86" class="header-anchor"&gt;&lt;/a&gt;7. Spring Boot 自动配置原理？
&lt;/h3&gt;&lt;p&gt;核心是 &lt;code&gt;@EnableAutoConfiguration&lt;/code&gt; 注解，通过 &lt;code&gt;SpringFactoriesLoader&lt;/code&gt; 加载 &lt;code&gt;META-INF/spring.factories&lt;/code&gt;（Spring Boot 3.x 改为 &lt;code&gt;META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports&lt;/code&gt;）中定义的自动配置类。结合 &lt;code&gt;@Conditional&lt;/code&gt; 系列注解（如 &lt;code&gt;@ConditionalOnClass&lt;/code&gt;、&lt;code&gt;@ConditionalOnMissingBean&lt;/code&gt;）按条件决定是否生效。&lt;/p&gt;
&lt;h3 id="8-如何自定义-starter"&gt;&lt;a href="#8-%e5%a6%82%e4%bd%95%e8%87%aa%e5%ae%9a%e4%b9%89-starter" class="header-anchor"&gt;&lt;/a&gt;8. 如何自定义 Starter？
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;创建 &lt;code&gt;xxx-spring-boot-autoconfigure&lt;/code&gt; 模块，编写自动配置类&lt;/li&gt;
&lt;li&gt;创建 &lt;code&gt;xxx-spring-boot-starter&lt;/code&gt; 模块，引入 autoconfigure 依赖&lt;/li&gt;
&lt;li&gt;在 &lt;code&gt;META-INF/spring.factories&lt;/code&gt; 或 &lt;code&gt;AutoConfiguration.imports&lt;/code&gt; 中注册&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="三spring-mvc"&gt;&lt;a href="#%e4%b8%89spring-mvc" class="header-anchor"&gt;&lt;/a&gt;三、Spring MVC
&lt;/h2&gt;&lt;h3 id="9-spring-mvc-的请求处理流程"&gt;&lt;a href="#9-spring-mvc-%e7%9a%84%e8%af%b7%e6%b1%82%e5%a4%84%e7%90%86%e6%b5%81%e7%a8%8b" class="header-anchor"&gt;&lt;/a&gt;9. Spring MVC 的请求处理流程？
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;客户端发送请求到 &lt;code&gt;DispatcherServlet&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;DispatcherServlet&lt;/code&gt; 查询 &lt;code&gt;HandlerMapping&lt;/code&gt; 获取对应的 &lt;code&gt;Handler&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;通过 &lt;code&gt;HandlerAdapter&lt;/code&gt; 调用具体的 Controller 方法&lt;/li&gt;
&lt;li&gt;Controller 处理业务，返回 &lt;code&gt;ModelAndView&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ViewResolver&lt;/code&gt; 解析视图名称&lt;/li&gt;
&lt;li&gt;渲染视图并返回响应&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="10-restcontroller-和-controller-的区别"&gt;&lt;a href="#10-restcontroller-%e5%92%8c-controller-%e7%9a%84%e5%8c%ba%e5%88%ab" class="header-anchor"&gt;&lt;/a&gt;10. @RestController 和 @Controller 的区别？
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@Controller&lt;/code&gt;：返回视图名称，需要配合 &lt;code&gt;@ResponseBody&lt;/code&gt; 返回数据&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@RestController&lt;/code&gt;：等价于 &lt;code&gt;@Controller + @ResponseBody&lt;/code&gt;，所有方法默认返回 JSON/XML&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="四spring-cloud"&gt;&lt;a href="#%e5%9b%9bspring-cloud" class="header-anchor"&gt;&lt;/a&gt;四、Spring Cloud
&lt;/h2&gt;&lt;h3 id="11-常见的服务注册中心有哪些"&gt;&lt;a href="#11-%e5%b8%b8%e8%a7%81%e7%9a%84%e6%9c%8d%e5%8a%a1%e6%b3%a8%e5%86%8c%e4%b8%ad%e5%bf%83%e6%9c%89%e5%93%aa%e4%ba%9b" class="header-anchor"&gt;&lt;/a&gt;11. 常见的服务注册中心有哪些？
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Nacos&lt;/strong&gt;：阿里开源，支持配置管理和服务发现&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Eureka&lt;/strong&gt;：Netflix 开源，AP 模型（已停止维护）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Consul&lt;/strong&gt;：HashiCorp 出品，支持健康检查&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Zookeeper&lt;/strong&gt;：CP 模型，强一致性&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="12-什么是服务熔断和降级"&gt;&lt;a href="#12-%e4%bb%80%e4%b9%88%e6%98%af%e6%9c%8d%e5%8a%a1%e7%86%94%e6%96%ad%e5%92%8c%e9%99%8d%e7%ba%a7" class="header-anchor"&gt;&lt;/a&gt;12. 什么是服务熔断和降级？
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;熔断&lt;/strong&gt;：当下游服务异常率超过阈值时，熔断器打开，快速失败，避免雪崩&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;降级&lt;/strong&gt;：熔断后的兜底策略，返回默认值或缓存数据&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;常用框架：Sentinel、Resilience4j、Hystrix（已停止维护）&lt;/p&gt;
&lt;h3 id="13-spring-cloud-gateway-核心概念"&gt;&lt;a href="#13-spring-cloud-gateway-%e6%a0%b8%e5%bf%83%e6%a6%82%e5%bf%b5" class="header-anchor"&gt;&lt;/a&gt;13. Spring Cloud Gateway 核心概念？
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Route（路由）&lt;/strong&gt;：网关的基本单元&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Predicate（断言）&lt;/strong&gt;：匹配请求条件&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Filter（过滤器）&lt;/strong&gt;：对请求/响应进行处理&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="五数据访问"&gt;&lt;a href="#%e4%ba%94%e6%95%b0%e6%8d%ae%e8%ae%bf%e9%97%ae" class="header-anchor"&gt;&lt;/a&gt;五、数据访问
&lt;/h2&gt;&lt;h3 id="14-spring-事务传播行为有哪些"&gt;&lt;a href="#14-spring-%e4%ba%8b%e5%8a%a1%e4%bc%a0%e6%92%ad%e8%a1%8c%e4%b8%ba%e6%9c%89%e5%93%aa%e4%ba%9b" class="header-anchor"&gt;&lt;/a&gt;14. Spring 事务传播行为有哪些？
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;传播行为&lt;/th&gt;
					&lt;th&gt;说明&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;REQUIRED&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;默认，有则加入，无则创建&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;REQUIRES_NEW&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;总是新建事务，挂起当前事务&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;SUPPORTS&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;有则加入，无则非事务执行&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;NOT_SUPPORTED&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;非事务执行，挂起当前事务&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;MANDATORY&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;必须在事务中，否则抛异常&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;NEVER&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;不能在事务中，否则抛异常&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;NESTED&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;嵌套事务，外部回滚则一起回滚&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="15-transactional-失效的常见场景"&gt;&lt;a href="#15-transactional-%e5%a4%b1%e6%95%88%e7%9a%84%e5%b8%b8%e8%a7%81%e5%9c%ba%e6%99%af" class="header-anchor"&gt;&lt;/a&gt;15. @Transactional 失效的常见场景？
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;方法非 &lt;code&gt;public&lt;/code&gt; 修饰&lt;/li&gt;
&lt;li&gt;同类方法内部调用（未经过代理）&lt;/li&gt;
&lt;li&gt;异常被 catch 未抛出&lt;/li&gt;
&lt;li&gt;抛出的异常类型不是 &lt;code&gt;RuntimeException&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;数据库引擎不支持事务（如 MyISAM）&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="六并发与缓存"&gt;&lt;a href="#%e5%85%ad%e5%b9%b6%e5%8f%91%e4%b8%8e%e7%bc%93%e5%ad%98" class="header-anchor"&gt;&lt;/a&gt;六、并发与缓存
&lt;/h2&gt;&lt;h3 id="16-spring-中如何使用缓存"&gt;&lt;a href="#16-spring-%e4%b8%ad%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8%e7%bc%93%e5%ad%98" class="header-anchor"&gt;&lt;/a&gt;16. Spring 中如何使用缓存？
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@Cacheable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;users&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;#id&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;getUserById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Long&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;userMapper&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;selectById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@CacheEvict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;users&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;#id&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;deleteUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Long&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;userMapper&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;deleteById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;支持的缓存实现：Redis、Caffeine、EhCache 等。&lt;/p&gt;
&lt;h3 id="17-async-异步执行注意事项"&gt;&lt;a href="#17-async-%e5%bc%82%e6%ad%a5%e6%89%a7%e8%a1%8c%e6%b3%a8%e6%84%8f%e4%ba%8b%e9%a1%b9" class="header-anchor"&gt;&lt;/a&gt;17. @Async 异步执行注意事项？
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;需在启动类添加 &lt;code&gt;@EnableAsync&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;方法需为 &lt;code&gt;public&lt;/code&gt;，且不能在同一个类内部调用&lt;/li&gt;
&lt;li&gt;推荐自定义线程池，避免使用默认的 &lt;code&gt;SimpleAsyncTaskExecutor&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="总结"&gt;&lt;a href="#%e6%80%bb%e7%bb%93" class="header-anchor"&gt;&lt;/a&gt;总结
&lt;/h2&gt;&lt;p&gt;以上是 2025 年高频 Java Spring 面试题的核心要点。建议结合源码理解底层原理，而不仅仅背诵答案。Spring 生态不断演进，持续关注 Spring Boot 3.x 和 Spring Cloud 2024/2025 版本的新特性至关重要。&lt;/p&gt;</description></item></channel></rss>