岗位题目
客户端相关面试题
HashMap 为什么会引入红黑树?
HashMap 引入红黑树,是为了解决哈希冲突严重时链表过长导致查询退化的问题。当同一个桶中的节点数量过多,链表查找会从平均常数级退化为线性级,红黑树可以把桶内查找复杂度降低到对数级,提升极端场景下的稳定性。
Android Activity 生命周期是什么?
Android Activity 生命周期描述一个界面组件从创建、可见、可交互、暂停、停止到销毁的状态变化。核心回调包括 onCreate、onStart、onResume、onPause、onStop、onDestroy、onRestart,实际开发还要理解配置变更、进程回收、状态保存和资源释放。
C++ 基类析构函数为什么通常要声明为虚函数?
C++ 基类析构函数通常要声明为虚函数,是为了保证通过基类指针或引用删除派生类对象时,能先调用派生类析构函数,再调用基类析构函数,完整释放派生类资源。否则行为可能未定义,容易造成资源泄漏或清理不完整。
C++ 如何限制类对象只能在堆上或栈上创建?
C++ 限制对象只能在堆上或栈上创建,本质是控制构造、析构和释放入口。只能堆上创建通常把析构函数设为 private 或 protected,并提供 destroy 接口;只能栈上创建通常禁用 operator new 和 operator new[],阻止动态分配。
客户端 Crash 发生后如何定位问题?
客户端 Crash 定位要从复现、日志、崩溃栈、符号化、版本环境、用户操作路径和近期变更入手,先判断是 Java/Kotlin 异常、Native 崩溃、ANR、OOM 还是系统兼容问题,再结合监控聚合和最小复现找到根因。
Java 有哪些常见加锁机制?
Java 常见加锁机制包括 synchronized、ReentrantLock、ReadWriteLock、StampedLock、原子类和基于 AQS 的同步器。面试重点不是罗列名称,而是说明它们的互斥语义、可重入性、公平性、可中断、条件等待、读写并发和适用场景。
Java 内部类为什么可以访问外部类成员?
Java 内部类能访问外部类成员,本质上不是虚拟机给了它特殊权限,而是编译器在字节码层建立了外部实例引用和访问通道。非静态内部类会携带指向外部对象的隐藏引用,因此能通过这个引用读取外部对象的字段和方法;对私有成员的访问则由同一 nest 的访问规则或编译期生成的桥接访问方法支持。
ConcurrentHashMap 的实现原理是什么?
ConcurrentHashMap 的核心是把哈希表操作拆成可并发执行的小粒度步骤:读操作大多依赖 volatile 可见性和链表或树查找,无需整体加锁;写操作在空桶上用 CAS 放入节点,在冲突桶上锁住桶头节点;扩容时通过 ForwardingNode 和协助迁移让多个线程共同搬迁数据。
线程安全的单例模式怎么写?
这题考察 Java 单例在并发下的安全发布、延迟初始化、重排序风险,以及枚举、静态内部类、DCL 各自的边界。
同题还出现在 1 个公司岗位
一个进程最多能打开多少文件描述符,受哪些限制?
一个进程最多能打开多少文件描述符,没有单一固定答案,取决于进程级软硬限制、系统级文件句柄上限、内核内存、服务管理器和容器配置,以及程序自身使用的 I/O 模型。实际排查要同时看 ulimit、/proc 限制、sysctl、systemd LimitNOFILE 和进程当前已打开的描述符。
HTTPS 为什么结合使用对称加密和非对称加密?
HTTPS 同时使用非对称加密和对称加密,是为了兼顾安全密钥交换、身份认证和传输性能。非对称加密适合解决陌生双方如何安全协商密钥和验证服务器身份的问题,但计算成本高;对称加密速度快,适合保护大量业务数据,因此握手阶段协商会话密钥,传输阶段用对称密钥加密数据。
Objective-C和Swift对比,安全性体现在什么方面?
Swift相对Objective-C的安全性,核心不是“更防黑客”,而是语言层面对类型、空值、内存、可变状态、错误处理和并发访问施加了更多编译期约束,把一部分Objective-C中常见的运行时崩溃、野指针、nil误用、类型误判和共享状态问题提前暴露。但Swift并不是绝对安全:强制解包、隐式解包、Any、unsafe pointer、Objective-C桥接、@objc动态派发和不当并发仍然会把风险带回来。
一个单向链表,奇数节点是升序、偶数节点是降序,怎么样将链表转变成降序的链表?
这道题的关键不是排序整个链表,而是利用题目已经给出的局部有序性:按位置拆出奇数位链表和偶数位链表。奇数位本身升序,反转后变成降序;偶数位本身已经降序;最后对两条降序链表做一次归并即可。
如何手写 LRU 缓存?
这题是典型手写实现题,关键是用 HashMap 加双向链表在 O(1) 完成查询、更新、移动和淘汰,并处理已有 key、容量边界和 map/list 同步。
同题还出现在 1 个公司岗位
进程与线程区别?
进程是操作系统进行资源分配、隔离和保护的基本单位,线程是进程内部的执行流,通常是 CPU 调度的基本单位。进程之间默认拥有独立虚拟地址空间和资源边界,隔离更强;同一进程内多个线程共享地址空间、堆、代码段、打开文件等资源,但各自拥有独立寄存器上下文、栈、线程局部存储和调度状态。
https,客户端拿到服务端的证书后是怎么验证证书的合法性?
HTTPS 证书合法性验证的本质,是确认服务端公钥可信地属于当前访问的域名。客户端会构建证书链、逐级验证签名、确认根 CA 受信任,再检查域名、有效期、用途、吊销状态和握手签名绑定。
TCP如何识别断开?
TCP 识别断开依赖报文、应用读写行为和超时机制共同完成。正常关闭通常通过 FIN 体现,应用读到 0;异常关闭常见为 RST,读写报错;静默断链不会立刻被发现,需要 keepalive、应用层心跳和业务超时兜底。
为什么 TCP 建立连接需要三次握手?
TCP 三次握手的目的不是单纯通知双方在线,而是让双方确认彼此的发送和接收能力、同步初始序列号、协商连接参数,并避免历史重复连接请求造成错误连接。两次握手无法可靠完成这些目标。
同题还出现在 2 个公司岗位
如何基于 UDP 实现可靠传输?
如何基于 UDP 实现可靠传输?这道腾讯牛客题的关键是围绕“基于 UDP 的可靠传输设计”讲清概念、机制、取舍和边界。基于 UDP 做可靠传输,本质是在应用层补齐 TCP 的一部分能力:序列号、ACK、超时重传、去重、乱序重排、滑动窗口、流量控制、拥塞控制和 MTU 控制。不能只回答 ACK 加重传。
怎么算出二叉树的深度?
怎么算出二叉树的深度?这道腾讯牛客题的关键是围绕“二叉树深度计算”讲清概念、机制、取舍和边界。二叉树深度可以递归计算:空树深度为 0,非空节点深度为 1 + max(leftDepth, rightDepth)。也可以用 BFS 层序遍历,每处理完一层深度加一。
对TCP的理解,有哪些特点?
对TCP的理解,有哪些特点?这道腾讯牛客题的关键是围绕“TCP 协议职责与特点”讲清概念、机制、取舍和边界。TCP 是传输层面向连接的可靠字节流协议,主要职责是为应用层提供可靠、有序、无重复的双向字节流,并通过流量控制和拥塞控制适配接收端与网络能力。
Http与Https的区别,Https是如何保证数据安全的?
Http与Https的区别,Https是如何保证数据安全的?这道腾讯牛客题的关键是围绕“HTTP、HTTPS 与 TLS 安全链路”讲清概念、机制、取舍和边界。HTTP 是明文应用层协议,HTTPS 是 HTTP 运行在 TLS 之上。TLS 通过证书链验证服务器身份,通过密钥交换协商会话密钥,后续数据主要用对称加密传输,同时用完整性校验防止篡改。
什么是动态规划?
什么是动态规划?这道腾讯牛客题的关键是围绕“动态规划定义与解题框架”讲清概念、机制、取舍和边界。动态规划适合具有最优子结构和重叠子问题的问题。回答时要讲清状态定义、转移方程、初始化、遍历顺序和结果位置,而不是先展开 DP 与贪心对比。
链表如何插入节点?
链表如何插入节点?这道腾讯牛客题的关键是围绕“链表节点插入流程”讲清概念、机制、取舍和边界。链表插入节点的核心是先保存后继,再改新节点和前驱的指针。单链表在已知前驱节点 prev 时,可以让 newNode.next = prev.next,再让 prev.next = newNode。
进程的虚拟地址是怎么分区的?
进程的虚拟地址是怎么分区的?这道腾讯牛客题的关键是围绕“进程虚拟地址空间分区”讲清概念、机制、取舍和边界。进程虚拟地址空间通常包括代码段 text、只读数据 rodata、已初始化数据 data、未初始化数据 bss、堆 heap、mmap 区、用户栈 stack 和内核空间映射边界。
TCP 协议具体是干嘛的?
TCP 协议具体是干嘛的?这道腾讯牛客题的关键是围绕“TCP 协议职责与特点”讲清概念、机制、取舍和边界。TCP 是传输层面向连接的可靠字节流协议,主要职责是为应用层提供可靠、有序、无重复的双向字节流,并通过流量控制和拥塞控制适配接收端与网络能力。
一个 UDP 包最多能装多少数据?
一个 UDP 包最多能装多少数据?这道腾讯牛客题的关键是围绕“UDP 报文大小与 MTU”讲清概念、机制、取舍和边界。一个 UDP 包理论 payload 最大值常说 IPv4 下 65507 字节,即 IP 总长度 65535 减 20 字节 IPv4 头和 8 字节 UDP 头。但工程上不能按这个值发送,实际要受链路 MTU、IP 分片、IPv6 最小 MTU、丢包和应用延迟约束。
String与StringBuffer的区别,StringBuffer如何实现线程安全的?
String与StringBuffer的区别,StringBuffer如何实现线程安全的?这道腾讯牛客题的关键是围绕“String、StringBuffer 与线程安全”讲清概念、机制、取舍和边界。String 是不可变对象,拼接会产生新对象或由编译器优化;StringBuffer 是可变字符序列,核心方法带 synchronized,因此同一实例的修改具备互斥;StringBuilder 也是可变字符序列,但不做同步,单线程更快。
进程线程区别?
进程线程区别?这道腾讯牛客题的关键是围绕“进程与线程区别及上下文切换”讲清概念、机制、取舍和边界。进程是资源拥有和隔离单位,线程是同一进程内的调度执行单位。同一进程的线程共享地址空间、堆、全局变量和文件描述符,但有独立栈、寄存器上下文、线程局部存储和调度状态。
进程间通信方式?
进程间通信方式?这道腾讯牛客题的关键是围绕“进程间通信方式”讲清概念、机制、取舍和边界。进程间通信方式包括匿名管道、命名管道 FIFO、消息队列、共享内存、信号量、信号、Unix domain socket、TCP socket、mmap 和文件锁。选择取决于是否亲缘进程、吞吐、延迟、同步需求和是否跨机器。
TCP 三次握手和四次挥手的流程是什么?
TCP 三次握手和四次挥手的流程是什么?这道腾讯牛客题的关键是围绕“TCP 建连与关闭状态机”讲清概念、机制、取舍和边界。TCP 三次握手负责建立连接和同步双方初始序列号;四次挥手负责分别关闭两个方向的字节流。建连关注 SYN、SYN+ACK、ACK 和双方收发能力确认;关闭关注 FIN、ACK、半关闭、CLOSE_WAIT 和 TIME_WAIT。
UDP 丢包通常有哪些原因,如何排查和缓解?
UDP 丢包通常有哪些原因,如何排查和缓解?这道腾讯牛客题的关键是围绕“UDP 丢包排查与缓解”讲清概念、机制、取舍和边界。UDP 丢包原因要从发送端、网络和接收端分层看:应用处理慢、socket buffer 太小、网卡 drops、MTU/IP 分片、网络拥塞、NAT/防火墙、接收端队列溢出都可能导致丢包。
树和堆这两种数据结构有什么区别?
树和堆这两种数据结构有什么区别?这道腾讯牛客题的关键是围绕“树与堆数据结构区别”讲清概念、机制、取舍和边界。树是一类层级数据结构,每个节点可以有子节点;堆通常是满足堆序性质的完全二叉树,是树的一种特殊形式。最大堆父节点不小于子节点,最小堆父节点不大于子节点。
TCP 如何保证可靠传输?
TCP 可靠传输依赖一组机制共同保证:序列号和确认号负责定位数据,重传机制处理丢包,滑动窗口控制发送节奏,校验和发现损坏,按序交付与去重处理乱序和重复,拥塞控制保护网络稳定。
同题还出现在 1 个公司岗位
synchronized 锁升级的过程是什么?
synchronized 锁升级的过程是什么?这道腾讯牛客题的关键是围绕“synchronized 锁升级过程”讲清概念、机制、取舍和边界。synchronized 锁升级是 JVM 为不同竞争强度优化 monitor 成本的过程,常见路径是无锁、偏向锁、轻量级锁、重量级锁。现代 JVM 版本对偏向锁支持有所变化,但面试回答仍要说明锁状态随竞争变化而升级。
图像滤波如何通过卷积实现,如何从频域理解低频平滑和高频边缘信息?
图像滤波可以从空间域和频域两条线理解:空间域里,卷积核在局部邻域加权求和,改变每个像素与周围像素的关系;频域里,卷积等价于频谱相乘,滤波器是在保留或抑制不同频率成分。低频通常对应缓慢变化的亮度和大块结构,低通滤波会平滑噪声和细节;高频通常对应边缘、纹理和突变,高通或梯度滤波会强化轮廓但也可能放大噪声。
大语言模型的参数量具体指什么,如何估算一个 Transformer Block 的参数规模?
这道题考察模型参数量的数量级推导能力。参数量是可训练权重标量的数量,不等于显存、FLOPs 或上下文长度。好答案要能用 hidden size、FFN 中间维度、层数、词表大小估算一个 Transformer block,并说明 GQA/MQA、SwiGLU、MoE、权重共享、LoRA 和量化对成本含义的影响。
大模型与 2020 年前传统模型的本质区别是什么?
这题考的是对大模型范式变化的理解:本质区别不只是参数更多,而是从任务专用模型转向大规模预训练、通用表示、自然语言交互、上下文学习和工程化治理并存的基础模型范式。
同题还出现在 1 个公司岗位