“为面试做准备,整理一些计算机专业的基础知识”,这个需求我在几年前第一次有面试念头时就想到了,但真正落地花了很长时间。当时我啃完了教科书,背了一遍又一遍概念,以为自己准备得很充分,结果在真正和面试官过招时还是经常卡壳——不是不记得理论,而是不知道该怎么把理论和具体场景串起来讲。后来我把知识体系重新拆了一遍,整理出一套适合自己的记忆地图和答题模板,再用几轮模拟面试磨了几遍,效果立刻不一样了。这套方法后来我也推荐给身边的应届生和准备跳槽的同事,反馈都还不错。
这篇文章我不打算按教科书目录走,而是把面试中真正高频出现、值得反复咀嚼的基础知识点按板块重新组织一遍。文里给出的不是机械背诵的答案,而是一个个“为什么”和“怎么答更容易抓住重点”的思路。希望它能帮你在面试前快速建立知识框架,也能在日常学习中反过来检验自己的理解深度。
1. 面试准备的第一步:先搭知识框架,别急着背细节
1.1 为什么面试官总喜欢先问基础题?
很多候选人觉得基础题“太简单”,反而挂在了这里。我接触过的技术面试官,多数把基础题当作试探工具:先问一个看似简单的概念,看你能不能用清晰的语言讲透,再顺着你的回答往深处问三步。比如从“介绍一下进程和线程的区别”能一路问到“线程之间怎么同步、死锁怎么产生、怎么排查、怎么避免”,一套连环追问走下来,候选人到底是真的理解还是死记硬背,基本一清二楚。
所以基础不是简单,基础是地基。地基不牢,后面聊项目、聊系统设计也会让人不放心。
1.2 计算机专业面试知识的核心地图
结合我自己的经历和身边同事的面试反馈,计算机基础相关的面试问题,绝大多数逃不开下面这几个板块:
- 数据结构与算法:复杂度分析、常用数据结构、典型算法范式
- 操作系统:进程与线程、同步互斥、死锁、内存管理、调度
- 计算机网络:分层模型、TCP/IP、HTTP/HTTPS、常见网络流程
- 数据库:SQL编写能力、索引原理、事务与隔离级别、锁与并发控制
- 编程语言基础:面向对象、内存模型、集合类/并发包、语言特性
- 少量综合题:设计思想、思维题、场景题
这些板块不是孤立的。操作系统和计算机网络会关联到“一个请求从浏览器发出,到服务端响应,经历了什么”;数据结构与算法会关联到“数据库索引为什么用B+树而不是哈希表”。我建议你在准备时画一张思维导图,把每个核心知识点当作节点,主动去连两条以上的“边”。连起来的边越密集,答综合题时就越容易找到线索。
1.3 准备节奏和自测方法
我的建议是分三轮:
- 第一轮:快速过知识点,把每章标题变成问题列表,读完能回答就过,不要扣细节。
- 第二轮:每个知识点按“是什么、为什么、怎么用、有什么坑”四层去复盘,写面试答题关键词。
- 第三轮:模拟面试,找朋友或对着录音软件提问,限时回答,重点练口头表达和追问应对。
这个方法有用的地方在于,它逼着你把“知道”变成“能说清楚”。很多知识点你以为自己懂了,真正说出口才发现逻辑是断的。用录音复盘听自己的回答,是最直接的检验方式。
2. 数据结构与算法:最硬核也最容易拉开差距的板块
2.1 复杂度分析:所有算法问题的基础语言
面试中一道算法题,最怕的不是写不出来,而是写出来了却说不清“时间复杂度为什么是这个”。面试官通常会追问:还有没有更优的做法?如果你只记得模板而不理解复杂度是怎么推导的,就很难应对。
要点是记住一种可复用的思考方式:
- 看循环嵌套层数和数据规模:一个循环是O(n),两个不相关循环嵌套是O(n²)
- 看递归树和分治:递归式T(n) = 2T(n/2) + O(n) 的结果是O(n log n)
- 看数据结构操作成本:哈希查询O(1)、有序数组二分O(log n)、二叉搜索树平均O(log n)但最坏O(n)
我常和准备面试的朋友说,刷题时先在题目旁边写“暴力解复杂度”,再写“优化解复杂度”。做这一步比直接看题解重要得多,因为面试考的不只是你能写出什么代码,更是你能不能判断这段代码在真实数据下会不会挂。
2.2 数组、链表、栈、队列:熟悉它们的“性格”
数组和链表是面试里最基础却最常拿来对比的一组。数组随机访问快、缓存局部性好,但插入删除要移动元素;链表插入删除快,但随机访问要遍历,缓存局部性也差。面试官问“ArrayList和LinkedList区别”时,本质就是在考察这两个结构的取舍意识。
栈的经典场景是括号匹配、表达式求值、单调栈找下一个更大元素。队列的经典场景是BFS、消息队列、缓存淘汰中的FIFO。栈和队列其实是一种“约束性结构”,限制了操作顺序,反而在很多场景里效率更高。准备时要能熟练写出循环数组实现队列,因为这本 pequeños考查的是指针/索引边界处理能力,是一个很容易写错的细节。
链表的高级技巧包括快慢指针判环、哨兵节点简化边界、递归翻转局部链表。写链表题目时建议先画出节点指向图,动手之前先用箭头把过程走一遍,再动手写代码,能大幅减少边界bug。
2.3 哈希表:空间换时间的第一课
哈希表在算法题里几乎是万能加速器。它的关键点是哈希函数设计、冲突处理、扩容策略。在Java中你用HashMap时并不需要真的去实现哈希表,但面试官会追问:哈希冲突怎么处理?常见的是链地址法和开放寻址法。Java HashMap在冲突链表过长时会转成红黑树,目的就是把查找从O(n)压到O(log n)。
实际刷题时,我总结出几个常见用法:
- 把数组元素值映射到下标,实现O(1)去重或查找
- 两数之和、无重复字符的最长子串等经典题目,核心就是“用哈希表存历史状态”
- 滑动窗口问题用哈希表记录窗口中元素频率,调整窗口边界
使用哈希表要注意覆盖边界情况,比如处理重复元素、处理key缺失的情况。很多代码在面试时跑普通case没问题,一到重复型数据就崩,基本都出在对缺失情况的处理上。
2.4 树与递归:面试中最大的“分水岭”
树的题目几乎绕不开递归。前序、中序、后序遍历是基础中的基础,虽然能背模板,但更重要的是理解递归的调用栈顺序:走到子节点再回溯的过程,天然匹配树的层级结构。
面试中高频的树问题包括:
- 二叉树最大深度:递归返回max(左子树深度, 右子树深度) + 1
- 判断平衡二叉树:在递归过程中顺便检查高度差
- 二叉搜索树的最近公共祖先:利用有序性判断两节点在左/右分支
- 层序遍历:用队列实现迭代版本
递归的问题很容易超时,比如重复子问题导致指数复杂度。遇到这种问题,脑子里要立刻闪过两个词:哈希记忆化、动态规划。面试官其实就是想看你能不能在写出递归后主动优化。
2.5 图、BFS/DFS与拓扑排序
图在面试里虽然没有刷题平台那么高频,但一旦出现,往往分值很高。核心准备重点是:
- 图的存储:邻接矩阵 vs 邻接表,大多数场景选邻接表,省空间、便于遍历
- 图的遍历:BFS找最短路径,DFS找可达性、连通分量
- 拓扑排序:解决依赖关系问题,比如课程安排、编译依赖,用Kahn算法配合入度数组,或者DFS后序逆序
- 并查集:处理动态连通性问题,核心是find和union,路径压缩后几乎O(1)
我特别想提醒的是,图的问题不要只停留模板,面试官会问“为什么BFS能找到最短路径而DFS不能保证”?答案在于BFS按层扩展,首次访问到目标节点的层数必然是最短路径;DFS可能先跑到一条很长分支,再返回找另一条更短分支,需要全部搜完才能确定。
2.6 排序与典型算法范式
排序算法中,面试高频的是快排、归并、堆排序。这些不只要求写出来,还要能讲清各自的复杂度、稳定性、适用场景:
- 快排:平均O(n log n),不稳定,适合大规模乱序数据,但最坏退化为O(n²)
- 归并:O(n log n),稳定,适合外部排序、链表排序
- 堆排序:O(n log n),不稳定,适合求前K大/前K小
动态规划的复习思路我个人很喜欢用“B站型刷法”:先做最简单的爬楼梯,搞懂状态怎么定义、递推公式怎么来;再做打家劫舍、背包、最长公共子序列。关键是总结出“五步法”:定义状态、写出转移方程、确定初始条件、明确遍历顺序、优化空间。
如果时间紧,至少要把“爬楼梯”、“最长公共子序列”、“01背包”、“股票买卖”这几类经典题型吃透。很多公司的笔试题就是这些题型的套壳变体。
3. 操作系统:从“进程”聊到“容器”,全链路串讲
3.1 进程与线程:最经典的开场问题
面试官百问不厌的问题是“进程和线程的区别”。基础答法很清晰:进程是资源分配的基本单位,线程是CPU调度的基本单位;进程拥有独立的地址空间,线程共享进程的地址空间。但要想加分,还要补充“为什么需要多线程”:单线程执行时,CPU在等待I/O期间是空闲的,多线程可以让计算和I/O重叠,提高CPU利用率。
再深一层的追问往往是“进程之间如何通信”,也就是IPC。常见机制包括:
- 管道:父子进程间,单向数据流
- 消息队列:内核维护的消息链表,支持多进程读写
- 共享内存:最快的方式,但需要配合信号量做同步
- 信号量:不仅是同步工具,也是互斥工具
- 套接字:跨网络或本机不同进程之间通信用
我见过的候选人里,能把这几个机制讲清楚的不多,尤其是在“共享内存为什么快、为什么还需要同步”这个问题上。答案就一句话:共享内存绕过了内核拷贝,但多个进程同时读写同一内存就得靠同步机制防止数据混乱。
3.2 同步互斥:锁、信号量、条件变量的使用场景
这一块面试官特别喜欢从代码切入:“多个线程同时操作一个计数器,结果不对,怎么办?”答法很简单:加锁。但接着会问:锁是什么?用自旋锁还是阻塞锁?读多写少场景用什么?
常见的同步原语要整理清楚:
- 互斥锁:同一时间只有一个线程能进入临界区
- 读写锁:允许多个读者,写者独占
- 信号量:不仅能互斥,还能控制并发数量,初始值N就代表允许N个线程同时访问
- 条件变量:配合互斥锁使用,线程等待某个条件满足后再继续
面试经典题是“实现一个生产者消费者队列”。如果要加分,可以在代码里体现“先加锁,判断条件用while而不是if,防止虚假唤醒”。这个细节很多候选人想不到,但只要提出来,面试官立刻会眼前一亮。
3.3 死锁:四个必要条件与排查思路
死锁是操作系统面试必考。四个必要条件是:互斥、持有并等待、不可剥夺、循环等待。破解思路也对应四个角度:破坏互斥(很难做到)、一次申请全部资源(破坏持有并等待)、允许抢占(破坏不可剥夺)、资源按序申请(破坏循环等待)。
面试官还喜欢问“实际项目里死锁怎么排查”。这个问题现在在技术面试里出现的频率越来越高。常用的底层手段包括:
- 查看线程堆栈,看线程在等待什么锁
- 用锁顺序检查工具分析代码路径是否有循环依赖
- 在压测时故意提高并发度,观察卡住线程的关键栈
实操后我发现,很多死锁并不是一开始设计就有问题,而是后续迭代或增加新的调用路径时破坏了锁顺序。所以写锁代码时的第一原则是:在所有需要多个锁的地方,保持全局一致的加锁顺序。
3.4 CPU调度与内存管理:从几十个进程说起
调度算法里,高频考点是:先来先服务、短作业优先、时间片轮转、优先级调度、多级反馈队列。尤其多级反馈队列,它是现代操作系统把“交互型任务优先”和“计算型任务吞吐率”结合起来的经典设计,面试官爱问原理,也爱拿具体场景考你选哪种算法。
内存部分的核心是虚拟内存。为什么要有虚拟内存?核心原因是让多个进程可以同时驻留内存,并且互不干扰,还能让程序使用比物理内存更大的地址空间。具体实现靠分页机制,CPU访问逻辑地址时经过页表转换成物理地址,缺页时触发缺页中断,从磁盘换入页面。
这里有个高频追问:“缺页后怎么选页面淘汰”?答案有FIFO、LRU、时钟算法等。LRU是最常被提起的,因为它利用了程序访问局部性原理。但面试官也会反问,“LRU怎么实现”?这就是数据结构题目了:哈希表加双向链表,每次访问把节点移到链表头部,链表尾部就是最久未使用的。
3.5 经典综合题:线程池参数怎么设
现在很多公司会把操作系统基础和实际研发经验结合起来问,比如“线程池的核心参数怎么设置”。这确实是操作系统知识的实战化。
线程池的关键参数包括:核心线程数、最大线程数、任务队列长度、拒绝策略。设置思路一般分两类:
- CPU密集型任务:线程数约等于CPU核数,避免过多切换
- I/O密集型任务:线程数可以设得比CPU核数多,因为大量时间在等待I/O
面试时能顺着这个思路继续谈“为什么I/O密集型任务可以多设线程”:因为线程在等待I/O时是不占用CPU的,多线程可以同时发起更多I/O请求,让CPU始终有活可干。这个引申点通常是加分项。
4. 计算机网络:从五层模型到一条URL的故事
4.1 分层模型是理解一切网络问题的线索
计算机网络部分,我建议先把OSI七层模型和TCP/IP四层模型对照起来,明确各层职责以及常见协议所在位置:
- 应用层:HTTP、FTP、DNS、SMTP
- 传输层:TCP、UDP
- 网络层:IP、ICMP、路由协议
- 链路层:以太网、ARP
- 物理层:比特流传输
分层的好处是把复杂问题拆成不同关注点,每一层只用管好自己的职责。面试的时候如果能把“分层让你能改协议而不影响整个体系”讲出来,就已经超过很多只会背七层的候选人了。
4.2 TCP三次握手和四次挥手:高频中的高频
TCP连接的三次握手要能画着图讲清楚:
- 客户端发送SYN报文,携带初始序号x,进入SYN_SENT状态
- 服务端回复SYN+ACK,携带自己的初始序号y,确认号x+1
- 客户端发送ACK报文,确认号y+1,双方进入ESTABLISHED状态
为什么需要三次而不是两次?核心目的不是“确认双方能收发”,而是同步双方初始序号。两次握手无法让服务端确认客户端的接收能力。经典的“已经失效的连接请求突然又到达服务端”场景,如果不加第三次握手,服务端会误以为新连接建立,浪费资源。
四次挥手的过程是:一方发送FIN,另一方回复ACK;等对方数据处理完后也发送FIN,另一方再回复ACK。主动关闭方进入TIME_WAIT状态,等待2MSL后才真正关闭,防止最后一个ACK丢失导致对端无法到达CLOSED状态。
面试连环追问经常会到:“为什么TIME_WAIT状态要等2MSL?”我的建议是分两层回答:一是确保最后的ACK能重传给对端,二是让本连接中所有报文在网络中消亡,避免影响后续新的连接。这样答,面试官会知道你并不是在背状态机,而是真的理解了设计意图。
4.3 TCP可靠传输、流量控制与拥塞控制
- 可靠传输依赖:序列号、确认应答、超时重传、快速重传
- 流量控制是端到端层面的,接收端用窗口字段告诉发送端还能收多少数据
- 拥塞控制是从发送端到网络整体层面,慢启动、拥塞避免、快重传、快恢复
慢启动是面试官最爱展开的点:拥塞窗口从1开始,每收到一轮ACK就翻倍,达到慢启动阈值后改为线性增长。遇到丢包后触发拥塞避免,窗口减半。这段如果能结合“为什么网络会拥塞、为什么不能只靠接收方控制”这个问题聊,分位会更高。
4.4 HTTP与HTTPS:状态码、请求方法、缓存与安全
HTTP常见状态码要分类掌握:
- 1xx:信息,101切换协议(WebSocket)
- 2xx:成功,200 OK,204 No Content
- 3xx:重定向,301永久移动,302临时移动,304 Not Modified
- 4xx:客户端错误,400 Bad Request,401未认证,403 Forbidden,404 Not Found
- 5xx:服务端错误,500 Internal Server Error,502 Bad Gateway,503 Service Unavailable
缓存相关头是面试高频:Cache-Control的max-age、no-cache、no-store,配合ETag/Last-Modified做条件请求,返回304。一个完整的“浏览器缓存机制”问题,其实是在考你对HTTP缓存模型有没有整体认知。
HTTPS在握手阶段做对称密钥协商:客户端发起请求,服务端返回证书;客户端验证证书合法性,取出公钥,用它加密一个随机数作为预主密钥发给服务端;双方用这个预主密钥生成会话密钥。之后的应用数据传输都走对称加密,因为非对称加密太慢,只能用在握手阶段。这个“混合加密体系”的理解,比单纯背“HTTPS是安全版HTTP”要加分得多。
4.5 输入一个URL到页面显示,完整流程怎么讲
这是综合题,面试官最爱用来考查宏观视野。答法的推荐顺序:
- 浏览器解析URL,提取协议、域名、端口、路径
- DNS解析域名,获取目标IP(先查本地缓存,再逐级递归查询)
- 浏览器与服务器建立TCP连接,经过三次握手
- TLS握手(如果是HTTPS)
- 浏览器发送HTTP请求,服务器处理并返回HTML等资源
- 浏览器解析HTML构建DOM树,解析CSS生成样式树,执行JavaScript
- TCP四次挥手或连接复用,浏览器继续加载子资源
回答时保持层次感,不要一步跳到底,面试官会在某个点停下追问细节。很多候选人一上来就聊渲染机制,结果漏了DNS和TCP,反而让人觉得知识不完整。
5. 数据库:SQL、索引与事务是三大命门
5.1 SQL基本功:别让写SQL拖后腿
技术面试里,手写SQL或线上笔试的SQL题很常见。核心考点是:多表连接、聚合查询、子查询、去重、排序、分组过滤、分页。写SQL时有个容易被忽略的点:WHERE在聚合之前过滤,HAVING在聚合之后过滤。GROUP BY字段若和聚合函数混用,要注意哪些列可以出现在SELECT中,这偏离标准SQL时很容易踩坑。
准备阶段我建议把LeetCode数据库题库里的简单题全部刷一遍,覆盖JOIN、IN、EXISTS、窗口函数。窗口函数(ROW_NUMBER、RANK、DENSE_RANK)在大数据集分析题里使用率极高,面试中出现在“排名第N”类的题目里,是必须掌握的能力。
5.2 索引原理:为什么用B+树
“为什么索引用B+树”是数据库最经典的追问。很多时候面试官并不是想听你背诵“B+树矮胖、磁盘IO次数少”,而是希望你把这个结论拆解成逻辑链。
标准回答思路:
- 数据库查询的主要瓶颈是磁盘I/O,一次IO能读到的数据量有限,树的高度越低,磁盘IO次数越少
- B+树是多叉平衡树,相比二叉树明显“矮”,所以查找次数少
- B+树所有数据都在叶子节点,并且叶子节点用链表串起来,范围查询时顺序扫描即可
- B+树叶子结点的磁盘空间利用率高,内部节点只存键值,能装更多键
关于索引失效问题,高频场景要会判断:左模糊匹配、对索引列使用函数、隐式类型转换、联合索引不满足最左前缀。记不住到底哪些会失效时,先走一遍执行计划(EXPLAIN),看有没有走全表扫描,比死背规则可靠。
5.3 事务ACID与隔离级别
事务的四大特性是原子性、一致性、隔离性、持久性。核心难点是隔离性,它用隔离级别体现。
隔离级别从低到高:
- 读未提交:最低,可能脏读
- 读已提交:避免脏读,但可能不可重复读
- 可重复读:避免不可重复读,MySQL InnoDB默认级别
- 串行化:最高,强制加锁,避免幻读
面试官会追问“不可重复读和幻读的区别”。我的答法是:不可重复读是同一事务内读同一行,两次读到不同的值;幻读是同一事务内执行同一个范围查询,第二次多出几行或少了某行。一个盯的是行值变化,一个盯的是结果集数量的变化。
MySQL InnoDB在可重复读下通过MVCC + 间隙锁来规避幻读问题,这也是它能默认使用可重复读的原因。面试时如果能把MVCC的基本思路讲清楚——每行有隐藏的版本号,读快照不过当前版本——就已经达标了。
5.4 锁与并发控制:行锁、表锁、死锁排查
数据库并发控制相关的常见问题有:
- InnoDB支持行锁和表锁,行锁在并发读写下颗粒度更细,但占内存更多
- 间隙锁(Gap Lock)用于锁定区间,防止幻读
- 死锁出现时,数据库会检测到并选择牺牲一个事务回滚,应用层需要做好超时重试
实际经验里,数据库死锁比进程死锁更常见,比如两条业务代码都按不同顺序更新两个表,就容易互相等待。我的建议是统一加锁顺序,同时把大事务拆小,减少锁持有时间。
6. 编程语言基础:从“会写”到“能讲”
6.1 面向对象:封装、继承、多态不是背出来的
面试官问“什么是多态”,很多人的回答只会说“父类引用指向子类对象”。但更合格的回答是:多态是同一消息作用于不同对象时产生不同行为的能力,它的价值在于让代码面向抽象编程,而不依赖具体实现。
我在复盘时发现,把“封装、继承、多态”和“反正则优于继承”关联起来是加分项,因为后者体现的是你在真实项目中如何避免类爆炸、如何做组合。组合优于继承背后的核心原因:继承在编译期固定了关系,父类变更会波及所有子类;组合在运行期动态选行为,更灵活。
6.2 equals与hashCode:基础中的隐藏考点
以Java为代表,equals和hashCode为什么必须一起重写?核心逻辑是:对象放入HashSet或HashMap时,先算hashCode定位到桶,再用equals判断是否同一个key。如果两个对象equals相等但hashCode不同,哈希表会认为它们是不同key,导致数据重复放入,语义就坏了。
回答这个问题的好模板是:先解释hashCode的作用和hash桶结构,再解释equals和hashCode的约定关系,最后给一个“为什么不用只equals”的场景实际出问题。讲清楚这个链条,比直接背“两个方法一起重写”好得多。
6.3 栈、堆、内存模型与垃圾回收
编程语言内存模型这块,如果是JVM方向,面试常问堆内存划分、GC算法、回收器。核心知识点:
- 堆内存分新生代和老年代,新生代又分Eden和两个Survivor区
- 对象优先在Eden区分配,经历Minor GC后进入Survivor,经过一定次数转入老年代
- GC算法有标记清除、标记复制、标记整理
- 常用的判定对象可回收的方法是可达性分析,从GC Roots出发,无法到达的对象可被回收
我会提醒准备面试的同学,不要只背算法名词,要能回答“为什么新生代用复制算法”。原因很简单,新生代对象大多朝生暮死,存活率低,复制算法的代价小;老年代对象存活率高,适合标记-整理或标记-清除,减少内存碎片。
6.4 并发编程:从Thread到并发包/协程
并发包是高频考点。核心资源包括:线程池、并发容器(ConcurrentHashMap、CopyOnWriteArrayList)、同步工具(CountDownLatch、CyclicBarrier、Semaphore)、原子类、锁(ReentrantLock、synchronized)。
ConcurrentHashMap在Java面试里被问到概率极高。答法建议按版本演进讲:早期版本用分段锁,Java 8之后改为CAS + synchronized锁桶,降低锁粒度,查询和并发度都有提升。如果能把“为什么读操作不需要加锁也能保证安全”答出来,说明确实研究过源码而不是只背结论。
如果是Go或Python背景,就是协程/goroutine和GIL这类话题。无论哪种语言,“并发模型是什么、锁怎么用、怎么避免竞态条件”的底层逻辑是相通的。
6.5 代码能力准备:不光是刷题
除了手写算法,面试还可能在白板上考代码风格和边界处理。我总结过几条“一眼专业”的细节:
- 方法命名和变量命名要有意义,不要到处都是temp
- 边界条件在写代码前先说出来,比如数组为空、长度为1、目标不存在
- 每写完一段逻辑,主动检查空指针和下标越界
- 复杂逻辑加注释,说明“这段在干什么、为什么这么写”
这些细节在面试官眼里比代码本身更能反映你日常写代码的习惯。
7. 高频题速查表:不依赖临场记忆的答题要点
我把自己最常复盘的一些高频问题整理成一张表。这里不写完整答案,只放“答题时一定要覆盖到的关键词”,方便你考前快速过一遍,然后用自己的语言串起来。
| 问题 | 背诵关键词 |
|---|---|
| 进程和线程的区别 | 资源分配基本单位 vs 调度基本单位、独立地址空间 vs 共享地址空间、切换成本 |
| TCP为什么三次握手 | 同步初始序号、防止失效请求建立连接、确认双方收发能力 |
| 为什么索引用B+树 | 低树高、磁盘IO少、叶子节点链式结构支持范围扫描、内部节点纯索引 |
| 快排最坏情况 | 每次基准值都取到极端值,分区极度不均,退化O(n²) |
| 死锁四个条件 | 互斥、持有并等待、不可剥夺、循环等待 |
| HashMap的hash冲突 | 链地址法、红黑树化、扩容 |
| 隔离级别的区别 | 脏读、不可重复读、幻读 |
| 什么是CAS | 比较并交换、乐观锁、ABA问题 |
| HTTP缓存 | Cache-Control、ETag、304 |
| 虚拟内存 | 逻辑地址、页表、缺页、局部性 |
考前快速看这张表,不是为了背答案,而是检查自己能不能不看任何资料把这些词串成逻辑通顺的完整回答。如果有哪一行发现“自己只能说出名词,但说不出为什么”,就回去翻对应章节。
8. 面试实战经验:怎么答基础题才能拿高分
8.1 答题的结构化公式
实战中我发现,同样一个问题,用结构化方式回答和零散回答,面试官的评价差别很大。我常用的公式是:结论先行 → 展开核心逻辑 → 举例或场景 → 指出难点或坑。
举个例子,面试官问“什么是阻塞队列”:
- 结论先行:阻塞队列是在队列基础上增加阻塞语义的并发容器,队列空时消费者阻塞,队列满时生产者阻塞。
- 展开逻辑:底层靠锁和条件变量实现,线程在队列满/空时进入等待,生产者放入元素后唤醒消费者。
- 举例场景:线程池的任务队列就是一个典型应用,任务提交线程往队列放任务,工作线程从队列取任务执行。
- 指出坑:使用时要小心拒绝策略,队列无限增长可能撑爆内存。
这套结构能保证你的回答有框架、有深度、有细节,还不容易跑偏。
8.2 模拟面试怎么练最有效
我强烈建议至少做三次完整的模拟面试,每次约一小时。不用特别正式,可以在会议室里找一个同事或朋友当面试官,也可以自己对着录音设备按面试流程走一遍。
我自己的经验是:
- 准备15道高频问题清单,覆盖数据结构、操作系统、网络、数据库、语言各3-4题
- 每道题限时3-5分钟回答,超过就停
- 回放录音时重点听:有没有说一堆“嗯”“然后”却没说到核心?是不是绕了半天没给结论?
模拟面试的作用是暴露你看似会但说不清的知识盲区。这个效果比刷题更显著,因为刷题是“写得出就行”,面试是“同时要讲得清,还要经得住追问”。
8.3 面试当天的心态和技术细节
最后分享一些面试当天的建议:
- 提前把简历里提到的每一项技术栈对应的基础问题过一遍,比如你写了“熟悉MySQL”,至少要能回答索引和事务
- 面对不会的问题,先说出自己理解的那部分,再明确表示“这块我还没深入,需要回去再补”,不要硬编答案
- 面试官追问时,如果有思路就边说边想,即使说得不完整,面试官也能看到你的推理过程
- 手写代码前先讲思路,征得面试官同意后再动手,这是很多大厂面试流程的默认要求
我自己在面试别人时,最看重的不是候选人所有问题都对答如流,而是面对不确定问题时会不会诚实地表达、会不会用已有知识尝试推导新问题。基础题准备的最终目标不是成为“人形百科”,而是让面试官确信:这个人的计算机功底扎实,遇到新问题时也能靠扎实的原理自己找到答案。
希望这份整理能帮你少走几步弯路。每个人知识薄弱点不太一样,你可以把我的框架拿来当作一张通行地图,把自己已经掌握的内容划掉,把薄弱的部分标记成重点,然后按自己的节奏逐个击破。面试准备这件事,真正难的不是知识量大,而是不知道从哪里开始。框架搭好了,路就出来了。