经典面试题汇总
# 目录介绍
- 1.Java面试题汇总
- 2.C语言面试题汇总
- 3.C++编程面试题
- 4.JavaScript面试题
- 5.设计模式面试题
- 6.数据结构和算法
- 7.网络编程面试题
- 8.Android面试题
- 9.iOS面试题汇总
# 1.Java面试题汇总
- Synchronized:必问,java的锁机制。特别是jdk6之后的锁优化以及运用场景。为什么是重量级的、JVM层如何实现,锁升级和降级
- Lock:必问,AQS的原理最好懂。一般会拿来和synchronize比较。具体原理是怎么实现的?
- volatile:必问,会拿来和锁比较,他的两个重要作用。更深点会问到cpu缓存一致性协议、以及指令重排的类型与原理。
- 死锁:一般询问如何解决或者产生的条件。如何排查死锁和解决死锁问题?
- 反射:反射性能问题如何理解,如何提高反射效率,怎么获取泛型类型,反射使用场景和设计思想。
- 泛型:泛型擦除理解。方法,成员变量,方法体里面局部变量,那些会被擦除。
- 线程通信:Object的wait和notify。阻塞唤醒,一般会用一个代码或者具体的场景来询问如何保证多线程同步。
- 类:类加载机制。成员初始化顺序。同时还会问双亲委托机制。类加载器原理,使用场景等等。
- 线程与进程的内存关系:如一个线程占多少内存、一个进程可以开多少线程、一个进程占用多少内存等。如何处理线程异常。
- 多线程:多线程并发问题,并发三要素,有哪些锁,锁对应的原理是什么,锁的升级和降级理解,有哪些保证线程安全的方式
- 线程池:核心设计思想,线程池分类和使用场景,线程池复用问题,execute和submit有何区别,工作队列和阻塞队列如何理解。
- 对象:对象内存布局,对象的创建过程和内存分配情况,如何访问对象,对象如何判断死亡,如何理解方法调用栈帧等。
- 内存分布:JVM内存模型、运行时数据区、native内存分布。很看对JVM的理解程度。
- HashMap:1.7,1.8的差异,1.8中什么情况下转换为红黑树,构造函数中参数代表的意思
- GC过程:(判断对象是否存活,GC算法),垃圾回收机制,GC链路分析过程。
- 注解:注解场景有哪些,分类,注解为何跟反射一起用。编译器和运行期注解框架如何设计?
- 异常:为何设计异常,Error和Exception异常体系,异常处理机制是什么?异常捕获流程?异常性能分析?
# 2.C语言面试题汇总
- 指针:必问,指针与数组的区别,指针的指针如何理解,函数指针与指针函数如何区分,野指针与悬空指针的产生原因与规避方法。
- 内存管理:malloc/calloc/realloc/free的区别与使用场景,内存泄漏如何定位,堆栈内存分配差异,内存对齐原理与 #pragma pack 的作用。
- 内存分区:代码区、常量区、全局/静态区、堆、栈的划分依据,局部变量、全局变量、static变量、const变量分别存储在哪个区。
- 数组与指针:sizeof(数组) 与 sizeof(指针) 的区别,数组退化为指针的场景,二维数组传参的三种写法。
- const/volatile/static:const修饰指针的四种写法,volatile在多线程/中断/硬件寄存器中的作用,static修饰变量与函数的可见性与生命周期差异。
- 结构体与联合体:struct内存对齐计算,位域的使用,union的底层原理和字节序检测(判断大小端)。
- 字符串:strcpy/strncpy/memcpy/memmove的区别,为何memmove能处理重叠内存,手写strcpy/strlen要求考虑健壮性。
- 函数调用:函数调用栈帧结构,参数传递顺序,可变参数va_list实现原理,尾递归优化。
- 宏与inline:宏定义的副作用(如 #define MAX(a,b)),do{...}while(0)的作用,宏与 inline 函数的优劣对比。
- 预处理与编译:预处理、编译、汇编、链接四个阶段分别做了什么,extern "C" 作用,头文件重复包含如何解决(#ifndef / #pragma once)。
- 关键字:typedef与#define的区别,register/auto/extern的含义,sizeof 为何是运算符而不是函数。
- 大小端:如何判断大小端,网络字节序与主机字节序的转换(htonl/ntohl)。
- 位运算:常考题如不用临时变量交换两个数、判断2的幂、统计二进制中1的个数、lowbit用途。
- 文件IO:fopen/open的区别,缓冲IO与非缓冲IO,fflush作用,文件读写出错如何定位。
- 常见陷阱:数组越界、缓冲区溢出、整数溢出、有符号/无符号比较陷阱、浮点数精度比较。
# 3.C++编程面试题
- 面向对象三大特性:封装/继承/多态的C++实现,虚函数表vtable与虚表指针vptr内存布局,多态调用的实际流程。
- 虚函数:必问,虚函数、纯虚函数、虚析构函数的区别,为什么构造函数不能是虚函数、析构函数为什么要声明为虚函数。
- 继承:公有/保护/私有继承的访问规则,菱形继承问题与虚继承的解决原理,virtual base class的内存布局。
- 内存管理:new/delete与malloc/free的区别,new的两步过程(operator new + 构造),placement new,定位new的使用场景。
- 智能指针:必问,unique_ptr/shared_ptr/weak_ptr的区别与使用场景,shared_ptr的引用计数如何线程安全,循环引用如何用weak_ptr解决,手写实现shared_ptr。
- 左值与右值:左值引用与右值引用的区别,移动语义与std::move原理,完美转发与std::forward,返回值优化RVO/NRVO。
- 模板:函数模板与类模板,模板特化与偏特化,SFINAE,变长模板参数,模板元编程基础。
- STL容器:vector扩容机制(1.5倍/2倍),map与unordered_map底层实现(红黑树 vs 哈希表),deque的分段连续内存布局,list的双向链表实现。
- STL迭代器:迭代器失效场景(vector扩容、map/set erase),五种迭代器分类。
- 常量与类型:const、constexpr、mutable的区别,static_cast/dynamic_cast/const_cast/reinterpret_cast四种转换的使用场景与安全性。
- C++11/14/17特性:auto、decltype、lambda、范围for、nullptr、初始化列表、结构化绑定、std::optional、std::variant等必问。
- Lambda:捕获方式(值/引用/mutable/this),Lambda的底层实现(匿名类+operator())。
- 多线程:std::thread、std::mutex、std::condition_variable、std::atomic的使用,内存序memory_order六种语义。
- 异常:异常安全三个级别(基本/强/不抛),RAII思想,为什么析构函数不要抛异常,noexcept的作用。
- 对象生命周期:构造/析构顺序,拷贝构造与赋值运算符的区别,三/五法则(Rule of Three/Five)。
# 4.JavaScript面试题
- 数据类型:必问,原始类型与引用类型的区别,typeof、instanceof、Object.prototype.toString的差异,如何精准判断数组。
- 作用域与闭包:必问,函数作用域、块级作用域、词法作用域,闭包的原理与经典应用场景,闭包引起的内存泄漏。
- this指向:四种绑定规则(默认/隐式/显式/new),箭头函数this的特殊性,call/apply/bind的区别与手写实现。
- 原型链:必问,proto、prototype、constructor三者关系,原型链查找流程,new的执行过程,instanceof的底层原理。
- 继承:寄生组合式继承,ES6 class与extends的底层实现(仍是原型链),super关键字原理。
- 事件循环:必问,宏任务与微任务,事件循环执行顺序,Promise.then、setTimeout、setImmediate、process.nextTick的执行时机。
- Promise:必问,Promise三种状态,链式调用原理,Promise.all/race/allSettled/any的区别,手写Promise符合Promise/A+规范。
- async/await:async/await的底层实现(Generator+Promise),异步代码的错误处理,串行并行执行。
- 深浅拷贝:赋值、浅拷贝、深拷贝的差异,常见深拷贝实现(JSON、递归、structuredClone),循环引用如何处理。
- 防抖与节流:使用场景(输入搜索、滚动、resize),手写debounce与throttle,leading/trailing的差异。
- 模块化:CommonJS、AMD、CMD、UMD、ES Module的区别,CommonJS与ESM的差异(同步/异步、值拷贝/引用)。
- V8引擎:V8执行流程,隐藏类与内联缓存,V8的GC机制(新生代Scavenge、老生代Mark-Sweep/Mark-Compact)。
- ES6+新特性:let/const与var的区别、暂时性死区、解构赋值、Symbol、Proxy/Reflect、Map/Set、迭代器与生成器。
- 垃圾回收:引用计数与标记清除,V8的分代回收机制,如何避免内存泄漏(全局变量、闭包、DOM引用、定时器)。
- 浏览器相关:从输入URL到页面渲染全过程,重绘与回流,事件委托原理,跨域解决方案(CORS/JSONP/代理)。
# 5.设计模式面试题
- 单例模式:必问,懒汉/饿汉/双重检查锁/静态内部类/枚举五种实现,为什么DCL需要volatile,如何防止反射和反序列化破坏单例。
- 工厂模式:简单工厂、工厂方法、抽象工厂三者的区别与适用场景,Spring BeanFactory就是典型工厂模式的应用。
- 建造者模式:Builder模式的使用场景(属性多、可选参数多),与工厂模式的区别,典型应用如OkHttpClient.Builder、StringBuilder。
- 原型模式:浅克隆与深克隆的实现,Cloneable接口,clone方法的设计原理。
- 适配器模式:类适配器与对象适配器,使用场景如ListView的Adapter、IO流中的InputStreamReader。
- 装饰器模式:与继承的区别、与代理模式的区别,IO流体系是装饰器模式的典型应用。
- 代理模式:必问,静态代理、JDK动态代理、CGLIB动态代理三者区别,JDK动态代理为什么只能代理接口,InvocationHandler原理。
- 观察者模式:必问,被观察者与观察者的关系,推模型与拉模型,事件总线EventBus、RxJava、LiveData都是观察者模式的应用。
- 策略模式:与状态模式的区别,消除大量if-else的常用手段,Comparator就是典型策略模式。
- 责任链模式:OkHttp的Interceptor链、Android的事件分发、Servlet的Filter链都是责任链模式。
- 模板方法模式:抽象类定义算法骨架,子类实现细节步骤,AQS、AsyncTask都是模板方法的应用。
- 迭代器模式:Iterator接口的设计思想,fail-fast与fail-safe的区别。
- 享元模式:Integer.valueOf的缓存池、String常量池都是享元模式。
- 六大设计原则:单一职责、开闭原则、里氏替换、接口隔离、依赖倒置、迪米特法则,每个原则的含义与代码体现。
- 设计模式的本质:面向接口编程、组合优于继承、封装变化,如何在项目中识别该用哪个模式。
# 6.数据结构和算法
- 数组与链表:数组的随机访问O(1)与链表的插入删除O(1)对比,单链表翻转、环形链表判断(快慢指针)、合并两个有序链表必问。
- 栈与队列:用两个栈实现队列、用两个队列实现栈,单调栈经典题(下一个更大元素、柱状图最大矩形),单调队列(滑动窗口最大值)。
- 哈希表:必问,冲突解决(开放寻址、链地址法、再哈希),负载因子,一致性哈希原理,如何设计一个LRU/LFU缓存。
- 字符串:KMP算法next数组原理,Manacher求最长回文子串,字符串匹配算法的时空复杂度对比。
- 二叉树:必问,三种遍历(前中后序)的递归与迭代写法,层序遍历,二叉树的最近公共祖先,二叉树的直径。
- BST/平衡树:BST的插入删除查找,AVL与红黑树的差异(平衡条件),红黑树的应用(HashMap/TreeMap/epoll),B树与B+树的区别及在数据库中的应用。
- 堆:大根堆小根堆的建堆过程,堆排序O(nlogn),Top K问题的两种解法(堆 vs 快速选择)。
- 图:DFS与BFS,拓扑排序,最短路径(Dijkstra、Floyd、Bellman-Ford),最小生成树(Prim、Kruskal),并查集。
- 排序:必问,快排/归并/堆排/冒泡/插入/选择/希尔/计数/基数/桶排的时空复杂度与稳定性,快排的优化(三数取中、随机化、小区间插排)。
- 递归与回溯:全排列、N皇后、子集、组合总和、括号生成等经典回溯题。
- 动态规划:必问,背包问题(0-1、完全、多重)、最长递增子序列LIS、最长公共子序列LCS、编辑距离、股票问题系列,状态定义与状态转移方程。
- 贪心算法:贪心与动态规划的区别,区间调度、跳跃游戏、分发糖果等经典题。
- 分治:归并排序、快速排序、大整数乘法、最近点对问题。
- 双指针与滑动窗口:对撞指针、快慢指针、滑动窗口的三种经典问题(最长无重复子串、最小覆盖子串、找所有异位词)。
- 位运算:只出现一次的数字、汉明距离、状态压缩DP、位运算实现加法。
- 时间空间复杂度:大O表示法,摊还分析(如vector扩容),空间换时间的典型思路。
# 7.网络编程面试题
- OSI与TCP/IP:必问,OSI七层与TCP/IP四层模型,每一层的典型协议与作用。
- TCP三次握手:必问,为什么是三次不是两次/四次,SYN/ACK的含义,SYN Flood攻击与SYN Cookie防御。
- TCP四次挥手:必问,为什么是四次不是三次,TIME_WAIT状态存在的原因(2MSL),CLOSE_WAIT过多的排查思路。
- TCP与UDP:必问,可靠性、连接性、有序性、流控、拥塞控制、使用场景的全面对比。
- TCP可靠传输:序号与确认号、超时重传、快速重传、SACK、流量控制(滑动窗口)、拥塞控制(慢启动、拥塞避免、快重传、快恢复)。
- HTTP协议:必问,HTTP报文结构,GET与POST的区别(幂等、长度、缓存),常见状态码(1xx/2xx/3xx/4xx/5xx)含义。
- HTTP版本演进:HTTP/1.0、1.1、2.0、3.0各自特性(长连接、管道化、多路复用、头部压缩HPACK、QUIC)。
- HTTPS:必问,TLS握手全过程,对称加密与非对称加密结合,证书链验证,为什么HTTPS比HTTP慢。
- DNS解析:必问,递归查询与迭代查询,DNS缓存层级,DNS劫持与HTTPDNS。
- 从输入URL到页面渲染:必问,DNS解析 → TCP连接 → TLS握手 → HTTP请求 → 服务端处理 → HTTP响应 → 浏览器渲染全流程。
- Socket编程:TCP/UDP socket编程流程,accept/connect/bind/listen/send/recv系统调用。
- IO模型:必问,阻塞IO、非阻塞IO、IO多路复用(select/poll/epoll区别)、信号驱动IO、异步IO,Reactor与Proactor模式。
- epoll原理:必问,红黑树+就绪链表的实现,LT与ET模式的区别,为什么epoll比select/poll高效。
- 跨域:同源策略,CORS、JSONP、Nginx反向代理、postMessage等跨域方案,预检请求OPTIONS。
- Cookie与Session:Cookie与Session的区别,SameSite属性,JWT与Session对比,分布式Session如何存储。
- 网络抓包:Charles/Fiddler/Wireshark抓包原理,HTTPS抓包需要安装根证书的原因,证书校验绕过。
- 粘包与拆包:TCP为什么有粘包,解决方案(定长、分隔符、长度字段)。
- 限流与重试:令牌桶与漏桶算法,指数退避重试策略,幂等性设计。
# 8.Android面试题
- 崩溃专题:崩溃治理,崩溃监听,崩溃原理,以及捕获崩溃异常。崩溃降级。
- ANR专题:ANR原理,信息收集,分析,监控,治理。造成ANR原因有哪些,如何解决的?
- 卡顿专题:卡顿原因,卡顿监控,卡顿治理,说一下卡顿治理的优化措施。如何监控渲染卡顿?
- 网络专题:网络优化,弱网,监控。如何抓包,放抓包处理等等,避免网络拦截
- 内存专题:内存监控,内存治理,内存如何分配。内存泄漏怎么排查,平常有做过哪些内存优化相关的工作?
- 启动专题:启动优化,页面打开优化,统计耗时。App启动过程有哪些优化?
- 稳定性专题:稳定性优化,做了那些稳定性工作,产生那些业绩,hook疑难问题解决?
- 安全专题:安全防御,挂载,xposed的工作原理。如何防抓包?涉及到抓包原理是什么?
- 图片专题:图片优化,大图检测,大图加载,图片加载流程,如何减少图片占用内存,图片圆角处理
- OOM专题:OOM是如何产生,OOM场景,OOM如何优化,OOM排查思路,OOM是如何监控
- FPS专题:通过invalidate说一下屏幕刷新机制?什么是流畅度?说一下Choreographer作用,VSYNC信号理解?FPS监控设计如何做?
- UI优化:布局检测工具有哪些?如何统计布局的损耗?源码如何加载xml布局?布局卡顿优化
- 进程专题:系统为什么会杀掉进程?进程回收优先级?app切换到后台后为什么容易被杀死?系统杀的为什么是我的进程,这是按照什么标准来选择的?
- 线程专题:如何做线程优化?如何统一线程调用?有哪些可以做异步任务的方式?线程CPU排查,线程卡顿。
- IPC专题:跨进程通信方案,AIDL是如何实现的?如何理解死亡代理,Binder机制,Binder流程原理。
- 组件化:module A 和 module B 之间有需要调用 Api 这块怎么解决的?module A 和 module B 之间如何通讯?
- Activity专题:必问,Activity生命周期,启动模式(standard/singleTop/singleTask/singleInstance),onSaveInstanceState触发时机,Activity启动流程(AMS/ActivityThread)。
- Fragment专题:Fragment生命周期,add/replace/show/hide区别,Fragment通信方式(接口/ViewModel/FragmentResult API),多Fragment嵌套管理。
- Handler机制:必问,Handler/Looper/MessageQueue/Message四者关系,主线程为什么不需要手动prepare Looper,MessageQueue的延迟消息如何实现,HandlerThread与IntentService原理。
- View绘制流程:必问,measure/layout/draw三大流程,MeasureSpec三种模式,自定义View的三种方式,事件分发的dispatchTouchEvent/onInterceptTouchEvent/onTouchEvent。
- Binder机制:必问,Binder驱动原理,一次拷贝的mmap实现,ServiceManager作用,AIDL生成代码分析。
- 热修复与插件化:类加载热修复(Tinker)、Native热修复(AndFix)原理对比,插件化DexClassLoader与资源加载解决方案。
- Jetpack:Lifecycle原理、LiveData原理(观察者+生命周期感知)、ViewModel如何跨配置变更存活、Room、WorkManager、Navigation。
- Kotlin协程:协程与线程区别,挂起函数原理(CPS变换+状态机),CoroutineScope/Job/Dispatchers,Flow与RxJava对比。
# 9.iOS面试题汇总
- 内存管理:必问,ARC与MRC的区别,引用计数如何实现,strong/weak/assign/copy/retain的使用场景与差异,autoreleasepool原理与释放时机。
- weak原理:必问,weak如何实现自动置nil,SideTable结构,weak_table与weak_entry的哈希存储。
- OC对象:对象的本质(struct objc_object),isa指针与Class的关系,isa的位域设计(nonpointer isa)。
- 类与元类:类对象、元类对象、根元类的继承链,方法调用如何通过isa查找到IMP。
- 消息机制:必问,objc_msgSend流程,方法缓存cache_t,消息转发三大阶段(动态方法解析、快速转发、完整转发)。
- Runtime:必问,类结构class_rw_t/class_ro_t,方法交换Method Swizzling的使用场景与坑,关联对象objc_setAssociatedObject原理。
- Category:Category的加载时机,Category与Extension的区别,+load与+initialize的调用时机与顺序,同名方法覆盖规则。
- Runloop:必问,Runloop与线程的关系,CFRunLoopMode(default/tracking/common),Runloop在AutoreleasePool、事件响应、手势识别、定时器、CADisplayLink、卡顿检测中的作用。
- 多线程:GCD同步/异步、串行/并行队列的四种组合,dispatch_once/dispatch_group/dispatch_barrier,NSOperation与GCD的对比,@synchronized的实现原理。
- KVO:必问,KVO底层原理(isa-swizzling动态生成NSKVONotifying_子类),手动触发KVO,KVO的坑与解决方案,自定义KVO实现。
- KVC:KVC的取值赋值流程,自动装箱拆箱,setValue:forUndefinedKey:的作用。
- Block:必问,Block的三种类型(NSGlobalBlock/NSStackBlock/NSMallocBlock),Block对外部变量的捕获规则,__block的原理,循环引用与解决。
- 属性关键字:copy为什么常用于NSString和Block,atomic为什么不能保证线程安全,readonly/readwrite/getter/setter的使用。
- 内存五大区:栈、堆、全局区、常量区、代码区,Tagged Pointer技术与NSNumber/NSString的小对象优化。
- UIView与CALayer:UIView与CALayer的职责划分,为什么UIView可以响应事件而CALayer不能,隐式动画与显式动画。
- 事件响应链:必问,hitTest:withEvent:与pointInside:withEvent:的调用流程,First Responder的传递机制。
- 图像渲染:离屏渲染的触发场景(圆角、阴影、蒙版、光栅化),如何避免离屏渲染,CoreAnimation的渲染流水线。
- 性能优化:启动优化(pre-main/main阶段)、卡顿监控(Runloop检测、子线程ping主线程)、内存优化、包体积优化。
- SwiftUI/Swift:值类型与引用类型的区别,Optional原理,协议扩展与默认实现,Swift的派发机制(静态/函数表/消息)。
- 架构设计:MVC、MVVM、VIPER的对比,组件化方案(URL Router、Protocol、Target-Action),路由跳转设计。
上次更新: 2026/06/28, 17:55:19