分页解析
第 3 页面试题
筛选题目 公司、岗位、知识点
公司
公司岗位
岗位
标签
虚拟 DOM 和 diff 算法
这题考察虚拟 DOM 的抽象目的、diff 的启发式假设、key 的节点身份作用和最终 patch 到真实 DOM 的过程。不要把虚拟 DOM 说成一定比直接操作 DOM 快。
数组常用的 API,哪些能改变原数组?
这题考察数组 API 的可变性和返回值语义。回答时按会修改原数组、返回新数组、只读取查询三类整理,并强调 sort、reverse、splice 是高频坑。
闭包是什么,闭包会导致什么?
这题考察词法作用域、变量保留、封装能力和内存风险。回答要说明闭包不是天然泄漏,只有无必要长期持有引用才会形成问题。
同题还出现在 1 个公司岗位
this 绑定说说
这题考察 this 的调用点规则、绑定优先级和箭头函数词法 this。回答要强调看调用方式,不是看函数声明位置。
Redis 如何删除和淘汰过期数据?
Redis 过期数据的处理分两层:先通过惰性删除和定期删除清理已经到期的 key;当内存仍然超过 maxmemory 时,再按淘汰策略驱逐候选数据。面试回答要区分“过期删除”和“内存淘汰”,再说明为什么 Redis 采用抽样和渐进式清理。
Redis 内存满了会发生什么?
Redis 内存满了之后的行为取决于 maxmemory 和 maxmemory-policy:可能触发淘汰并继续写入,也可能拒绝会增加内存的写命令。回答时要说明触发时机、策略分类、近似算法以及对业务的影响。
Redis 为什么速度快?
Redis 快的原因不是单点魔法,而是内存访问、高效数据结构、单线程事件循环、I/O 多路复用、协议简单和工程优化共同作用。回答时要避免只说“因为单线程”,还要说明单线程为什么反而减少了锁竞争。
Redis ZSet 底层如何实现?
ZSet 的底层实现要抓住两点:它同时需要按 member 快速查分数,又需要按 score 有序范围查询。因此典型实现是字典加跳表,小规模时使用紧凑编码以节省内存。
聚簇索引和非聚簇索引有什么区别?
聚簇索引和非聚簇索引的核心区别在于索引叶子节点是否直接保存完整数据行。聚簇索引决定数据行的组织方式,非聚簇索引是额外的查找结构,通常还需要再定位到真实数据。
数据库索引为什么能加速查询?
数据库索引能加速查询,是因为它用有序的数据结构把全表扫描变成定向查找,减少需要读取、比较和回表的数据量,并且可以利用有序性优化范围查询、排序和覆盖查询。
MVCC 的实现原理是什么?
MVCC 是多版本并发控制,通过为数据保留多个历史版本,让读操作基于一致性快照判断可见版本,从而减少读写互相阻塞。常见实现依赖隐藏版本字段、undo log、ReadView 和可见性规则。
MySQL 索引失效有哪些常见场景?
MySQL 索引失效通常不是索引真的损坏,而是查询写法、类型转换、联合索引顺序、模糊匹配、否定条件或优化器成本判断导致索引无法高效使用,甚至被执行计划放弃。
MySQL 查询为什么可能不走索引?
MySQL 不走索引通常不是“索引失效”这么简单,而是优化器认为使用索引的总代价不划算,或者查询条件的写法让索引无法被有效利用。面试中要从索引可用性、选择性、代价模型、联合索引规则和执行计划验证几层回答。
Java 双亲委派机制是什么,目的是什么?
双亲委派机制是 Java 类加载器的一种委派模型:一个类加载请求先交给父加载器尝试加载,父加载器加载不了时,子加载器才自己加载。它的目的主要是保证核心类库安全、避免类重复加载,并维持类身份的一致性。
Java 常见集合有哪些,各自适合什么场景?
Java 常见集合可以按接口体系理解:List 适合有序可重复数据,Set 适合去重,Map 适合键值映射,Queue 和 Deque 适合队列、栈和任务调度。回答时要结合底层结构、复杂度、是否有序、是否线程安全和典型场景。
自定义对象的 hashCode 应该如何计算?
自定义对象的 hashCode 应该基于 equals 使用的关键字段来计算,核心目标是满足“相等对象必须有相同哈希值”,同时尽量让不同对象分布均匀、计算稳定,并避免使用会频繁变化的字段。
为什么 equals 和 hashCode 要保持一致?
equals 和 hashCode 必须保持一致,是因为哈希容器依赖 hashCode 定位桶,再依赖 equals 判断对象是否相等。如果两个相等对象的 hashCode 不同,它们会被放到不同查找路径上,导致重复存储、查找失败和删除失败。
Java Object 类有哪些常见方法?
Java Object 类是所有类的根类,常见方法可以分为对象身份相关、运行时类型相关、字符串表示、克隆、线程协作和对象生命周期几类。面试回答要说明方法用途,也要点出 equals/hashCode、wait/notify、clone、finalize 的关键边界。
HashMap 为什么会引入红黑树?
HashMap 引入红黑树,是为了解决哈希冲突严重时链表过长导致查询退化的问题。当同一个桶中的节点数量过多,链表查找会从平均常数级退化为线性级,红黑树可以把桶内查找复杂度降低到对数级,提升极端场景下的稳定性。
ReentrantLock 如何基于 AQS 实现可重入锁?
ReentrantLock 的核心不是自己从零管理阻塞队列,而是把获取锁、释放锁、排队、唤醒、可中断等待、条件队列等通用同步能力交给 AQS。它用 AQS 的 state 表示重入次数,用独占线程记录锁持有者,通过公平或非公平策略决定是否允许新线程插队。
AQS 是什么?
AQS 是 Java 并发包中的基础同步框架,用一个 volatile state 表示同步状态,用一个 FIFO 等待队列管理竞争失败的线程,并通过模板方法把通用排队唤醒流程和具体同步语义分离。
Java 线程池有哪些核心参数?
Java 线程池的核心参数来自 ThreadPoolExecutor:corePoolSize、maximumPoolSize、keepAliveTime、unit、workQueue、threadFactory、RejectedExecutionHandler。真正要掌握的是它们如何共同决定线程创建、任务排队、扩容、回收和拒绝策略。
synchronized 和 ReentrantLock 有什么区别?
synchronized 是 JVM 层面的内置锁,语法简单,自动加锁释放;ReentrantLock 是 JUC 提供的显式锁,基于 AQS,功能更丰富。两者都可重入,都能保证互斥和可见性,但在使用方式、等待能力、公平性、条件队列和可中断性上差异明显。
RabbitMQ 如何实现消费者负载均衡?
RabbitMQ 的消费者负载均衡主要依赖同一队列上的多个竞争消费者。队列把每条消息投递给其中一个消费者,再通过 manual ack 和 prefetch 控制未确认消息数量,让处理更快的消费者获得更多后续消息。
RabbitMQ 仲裁队列的消费组如何工作?
RabbitMQ 仲裁队列是基于 Raft 的复制队列,解决的是队列高可用和数据一致性问题;它本身不是 Kafka 式消费组。消费者仍然通过订阅同一个队列竞争消费,消息由当前 leader 负责投递和确认推进。
RabbitMQ 延时队列通常如何实现?
RabbitMQ 延时队列常见实现有两类:使用 TTL 加死信交换机间接延迟,或使用 delayed message exchange 插件直接按延迟投递。前者通用但有顺序阻塞等细节,后者语义更直观但依赖插件。
Kafka 如何保证消息顺序性?
Kafka 的顺序性建立在分区日志之上:单个分区内消息按追加顺序存储和消费;跨分区不保证全局顺序。要保证同一业务维度有序,关键是把相同业务键路由到同一分区,并控制生产、消费和重试策略。
MySQL 如何防止幻读?
MySQL 防止幻读要分清快照读和当前读。InnoDB 在可重复读下通过 MVCC 让普通查询看到稳定快照,通过 next-key lock 和 gap lock 保护范围加锁查询,从而阻止其他事务在范围内插入新记录。
意图识别有哪些分类方式,如何实现?
意图识别可以按标签数量、业务层级、开放程度、是否结合槽位和决策阶段分类。实现上要从标签体系、数据标注、模型方案、置信度治理和线上闭环五个层面设计,而不是只训练一个分类器。
DPO 训练中的正反馈样例如何构造?
DPO 的正反馈样例不是单独的好回答,而是偏好对里的 chosen answer。构造时要保证同一 prompt 下正样本相对负样本更符合事实、指令、风格、安全和业务目标,并通过人工或高可信信号过滤噪声。
多意图识别中如何选择单标签和多标签分类?
多意图识别选择单标签还是多标签,取决于业务动作是否互斥、用户一句话是否可能触发多个独立流程、标注是否稳定以及下游系统能否处理多结果。单标签更简单稳定,多标签表达能力更强但需要阈值、冲突消解和更复杂评估。
SFT 之后做 DPO,DPO 和 RLHF/PPO 有什么区别?
SFT 之后做 DPO,是先让模型学会基本任务格式和能力,再用偏好对调整回答倾向。DPO 直接用偏好数据优化策略与参考模型的概率比,RLHF/PPO 通常先训练奖励模型,再通过强化学习在线优化奖励,工程复杂度和稳定性差异很大。
RAG 在意图识别中有什么作用?
RAG 在意图识别中的作用,是把相似历史表达、标签定义、业务文档和动态规则检索出来,辅助模型缩小候选、消除歧义、识别长尾和处理新业务。它不是替代分类器,而是给分类决策提供可更新的外部证据。
vLLM 有哪些技术优势,为什么推理性能高?
vLLM 推理性能高,核心来自围绕大模型解码瓶颈做系统优化:PagedAttention 降低 KV cache 内存碎片并提升复用,连续批处理提高 GPU 利用率,再结合高效调度、前缀缓存和并行能力提高吞吐。
Redis 主从同步有哪些策略?
Redis 主从同步主要包括全量同步、部分重同步和命令传播三类链路。第一次复制或偏移量缺失时走全量,短暂断线且复制积压缓冲区仍保留缺失命令时走部分重同步,正常状态下主节点持续把写命令传播给从节点。
Redis 怎么做数据迁移?
Redis 数据迁移没有单一标准答案,要按停机窗口、数据规模、是否跨版本、是否集群、是否需要保留 TTL 和一致性要求选择方案。常见方式包括 RDB/AOF 迁移、主从复制切换、SCAN+DUMP/RESTORE、MIGRATE、集群 reshard 和专用同步工具。
Redis 缓存雪崩、击穿和穿透分别是什么,如何解决?
缓存雪崩、击穿和穿透都是缓存失效后流量打到后端的风险,但触发条件不同:雪崩是大面积不可用,击穿是热点 key 瞬时失效,穿透是请求的数据本来就不存在。回答时要先分类,再分别给出限流、降级、互斥重建、空值缓存、布隆过滤器和 TTL 随机化等治理手段。
如何分析用户流失是否由推送过于频繁导致?
判断用户流失是否由推送过于频繁导致,不能只看推送次数和留存同时变化,而要建立频次暴露、用户分层、时间先后、剂量反应和对照实验。最可靠的方法是设计推送频次 A/B Test 或 holdout,对退订、卸载、次日活跃和长期留存做联合评估。
广告收益下降时应该从哪些角度分析?
广告收益下降要先做收入公式拆解,再沿流量、库存、填充、竞价、点击转化、价格、策略和技术链路逐层排查。核心不是罗列指标,而是判断下降来自曝光规模、变现效率、广告主需求还是埋点和结算口径变化。
如果日活下降是竞品原因,怎么证明?
证明日活下降由竞品导致,需要建立时间重合、用户迁移、外部强度、受影响分组和排除内部原因五类证据。最有力的结论通常来自竞品活动或上线节奏与本产品 DAU 变化之间的差分对比,而不是单纯说竞品最近很火。
留存率下降时如何分析原因?
留存率下降要从口径、分母结构、用户质量、产品体验、供给内容、触达策略和外部环境逐层拆解。好的分析会先定位哪个 cohort、哪个生命周期和哪个用户分组在下降,再寻找导致用户没有回来的具体机制。
A/B Test 中如何判断差异是否显著?
A/B Test 判断显著性,要先明确假设、主指标、样本量和实验单位,再用合适的统计检验计算 p 值、置信区间和效应量。显著不等于值得上线,还要检查随机化、样本比例、实验污染、护栏指标和业务收益。
MySQL 最左前缀原则是什么?
最左前缀原则是联合索引按定义顺序从左到右建立有序结构,查询只有从最左列开始连续使用索引列,才能充分利用联合索引。它影响 where 条件、范围查询、排序、分组和覆盖索引设计。
浏览器强缓存和协商缓存分别依赖哪些 HTTP 头?
浏览器强缓存主要依赖响应头 Cache-Control 和 Expires,协商缓存主要依赖 ETag/If-None-Match 与 Last-Modified/If-Modified-Since。Cache-Control 的优先级通常高于 Expires,ETag 的优先级通常高于 Last-Modified。
强缓存和协商缓存有什么区别?
强缓存和协商缓存的根本区别在于是否向服务器发请求。强缓存有效时浏览器直接使用本地副本;协商缓存需要发条件请求,由服务器判断资源是否变化,未变化返回 304。
CSS 如何实现垂直居中?
CSS 垂直居中没有唯一答案,要根据已知高度、未知高度、单行文本、多行内容、父容器布局和兼容性选择方案。现代布局优先使用 flex 或 grid,特殊场景再考虑 absolute+transform、line-height、table-cell 等方法。
哪些 CSS 属性会触发重排?
会触发重排的 CSS 属性,本质上都是会改变元素几何信息、文档流占位、字体度量、滚动尺寸或布局上下文的属性。典型包括 width、height、margin、padding、border、display、position、top、left、float、font-size、line-height、grid、flex 相关属性等;而 color、background-color 通常只触发重绘,transform、opacity 在合成层上变化时通常可以避开主线程布局。
requestAnimationFrame 属于什么任务,适合解决什么问题?
requestAnimationFrame 不是普通宏任务,也不是微任务,而是浏览器在一次渲染机会中、绘制之前执行的动画帧回调。它适合把视觉更新对齐到屏幕刷新节奏,用来做动画、滚动联动、分批 DOM 更新和避免 setTimeout 与刷新率不一致造成的卡顿。