已解析题目
字节跳动相关面试题
Redis 常见数据结构有哪些?
这题不只是列 Redis 类型,还要能按访问模式、底层编码、复杂度和大 key 风险说明为什么这样建模。
同题还出现在 1 个公司岗位
如何手写 LRU 缓存?
这题是典型手写实现题,关键是用 HashMap 加双向链表在 O(1) 完成查询、更新、移动和淘汰,并处理已有 key、容量边界和 map/list 同步。
同题还出现在 1 个公司岗位
线程安全的单例模式怎么写?
这题考察 Java 单例在并发下的安全发布、延迟初始化、重排序风险,以及枚举、静态内部类、DCL 各自的边界。
同题还出现在 1 个公司岗位
为什么 TCP 建立连接需要三次握手?
TCP 三次握手的目的不是单纯通知双方在线,而是让双方确认彼此的发送和接收能力、同步初始序列号、协商连接参数,并避免历史重复连接请求造成错误连接。两次握手无法可靠完成这些目标。
同题还出现在 2 个公司岗位
new 关键字的运行流程?实现一个自己的 new
这题考察 new 的四步语义、原型链绑定、this 绑定和构造函数返回值规则,手写实现要覆盖返回对象的特殊分支。
分布式系统中的一致性怎么保证?
这题考察一致性目标拆解、复制提交协议、读写路径取舍和故障后的收敛能力,不能只背 CAP 或只说加锁。
Java 的 GC 机制是怎样实现的?
这题考察对象存活判定、分代回收、GC 算法和收集器取舍,还会延伸到分配晋升、停顿和 GC 日志排查。
数据库事务是什么,ACID 分别代表什么?
这题考察事务边界、ACID 语义、日志恢复、隔离级别和业务不变量,重点是把概念落到数据库执行机制。
10G IP 文件、1G 内存,如何找出现最多的 Top10 IP?
这题考察海量数据精确 TopK 的分治思路、内存估算、全局正确性和数据倾斜处理。
图论算法具体有哪些?
这题考察图问题分类能力,要把问题类型、适用条件、图表示和复杂度一起说,而不是背算法名清单。
贪心算法和动态规划分别是什么?
这题考察候选人能否区分局部选择和状态枚举,关键是证明贪心安全性,并能写出 DP 的状态、转移、边界和遍历顺序。
业务中为什么要使用分布式锁?
这题考察分布式互斥的业务动机、锁粒度、正确实现条件和替代方案,重点是说明锁只能保护有限临界区。
Redis 分布式锁的单点故障怎么解决?
这题考察 Redis 锁在单点、异步复制和故障切换下的互斥风险,需要按安全等级给出方案,而不是只说上集群。
ZooKeeper 实现分布式锁的原理是什么?
这题考察临时顺序节点、前驱监听、会话语义和异常重试流程,重点是说明为什么相对公平且能避免惊群。
RocketMQ 和 Kafka 有什么区别?
这题考察消息队列选型,要从模型、存储复制、顺序语义、事务/延迟能力、消费重试和生态取舍比较,而不是简单说一个快一个稳。
消费者端幂等性如何实现?
这题考察至少一次投递下的消费安全,核心是用业务唯一键、可靠去重记录和状态机把重复消息变成无副作用。
Redis 持久化机制有哪些?
这题考察 RDB、AOF、混合持久化的恢复链路和可靠性取舍,还要区分持久化、复制和高可用解决的问题不同。
C++ 和 Java 的主要区别是什么?
考察语言对比是否能上升到运行时、内存资源、类型模型、性能控制、工程生态和适用场景,而不是停留在语法差异。
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 不走索引通常不是“索引失效”这么简单,而是优化器认为使用索引的总代价不划算,或者查询条件的写法让索引无法被有效利用。面试中要从索引可用性、选择性、代价模型、联合索引规则和执行计划验证几层回答。
MySQL B+ 树索引的实现
这题考察 InnoDB 如何用页式 B+ 树降低磁盘 I/O,并把等值查询、范围扫描、聚簇索引、二级索引和回表串成一条完整链路。
同题还出现在 2 个公司岗位
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 在意图识别中的作用,是把相似历史表达、标签定义、业务文档和动态规则检索出来,辅助模型缩小候选、消除歧义、识别长尾和处理新业务。它不是替代分类器,而是给分类决策提供可更新的外部证据。