程序员面试最常被问的10道题,答对7道算你厉害(文末免费领简历模板)
不是八股文,是实战中真正卡人的点
金三银四刚过,身边好几个朋友都在找工作。跟他们聊了一圈,发现一个共性问题:
很多人刷了半年LeetCode,结果面试挂在了一些“简单”问题上。
不是题不会做,是答不到面试官想听的点。
下面这10道题,是我从最近20多场技术面试里扒出来的高频题。每道题都附上了“面试官想听什么”和“怎么答才加分”。
你可以自测一下,看看能答上来几道。
文末整理了Java、前端、C++方向的简历模板,有需要的可以直接领。
一、基础篇
1. “讲一讲HashMap的原理”
这是Java面试的“入门级”问题,但80%的人答不到点上。
低级回答:HashMap是键值对存储的,线程不安全,允许null键和null值。
面试官想听什么:
底层数据结构:数组+链表+红黑树(JDK1.8之后)
哈希冲突怎么解决:链地址法
扩容机制:负载因子0.75,2倍扩容,resize时的rehash
为什么线程不安全:多线程下扩容可能产生死循环(JDK1.7)或数据丢失
和Hashtable、ConcurrentHashMap的区别
加分回答:顺带提一下JDK1.8对HashMap的优化——当链表长度超过8且数组长度超过64时,链表转红黑树,查找复杂度从O(n)降到O(log n)。
2. “线程池的七大参数,以及任务执行流程”
这题考的是对ThreadPoolExecutor的理解,背文档没用,要理解流程。
面试官想听的关键点:
七大参数:corePoolSize、maximumPoolSize、keepAliveTime、unit、workQueue、threadFactory、handler
核心执行流程:核心线程 → 阻塞队列 → 非核心线程 → 拒绝策略
4种内置拒绝策略:Abort、CallerRuns、Discard、DiscardOldest
加分回答:结合一个实际场景——比如“CPU密集型任务,线程池怎么设置?”(corePoolSize设为CPU核心数+1);“IO密集型任务怎么设置?”(corePoolSize设大一点,比如CPU核心数×2)。
3. “MySQL的索引为什么用B+树,不用B树?”
这道题考的是对数据库索引底层原理的理解。
常见的错误回答:“B+树查询更快”。(面试官内心:为什么?)
正确的回答逻辑:
B+树非叶子节点不存数据,只存键值,所以一个磁盘块能存更多索引,树的高度更低,IO次数更少
B+树的叶子节点用双向链表连接,支持范围查询和顺序扫描,B树做不到
B树每个节点都存数据,树更胖更高,范围查询需要多次回溯
加分回答:可以主动说“MyISAM和InnoDB的索引实现有什么区别”(聚簇索引和非聚簇索引)。
二、框架篇
4. “Spring Boot的自动配置原理”
这个问题考察的是对Spring框架源码的理解程度。
回答框架:
@SpringBootApplication是三个注解的组合:@SpringBootConfiguration+@EnableAutoConfiguration+@ComponentScan核心在
@EnableAutoConfiguration,通过@Import(AutoConfigurationImportSelector.class)导入AutoConfigurationImportSelector会读取META-INF/spring.factories文件,加载所有候选配置类每个配置类上的
@Conditional条件注解决定是否生效(如@ConditionalOnClass、@ConditionalOnMissingBean)
加分回答:可以举例说“比如RedisAutoConfiguration只有在引入了RedisTemplate依赖时才会生效”。
5. “事务失效的场景有哪些”
Spring事务是面试重灾区,很多人用了好几年,遇到问题还是不知道原因。
需要答出的失效场景:
方法不是
public的同一个类内部调用(没有经过代理)
异常被
catch了,没有抛出抛出的异常不是
RuntimeException(需要指定rollbackFor)数据库引擎不支持事务(如MyISAM)
加分回答:顺带解释一下@Transactional的原理——基于AOP,通过动态代理生成代理类,在代理类中开启和提交事务。
三、算法与设计篇
6. “如何设计一个秒杀系统”
这道题考的是系统设计能力,没有标准答案,但要有完整思路。
回答骨架:
流量层面:CDN缓存静态资源,Nginx限流(漏桶/令牌桶),前端防抖节流
中间件层面:消息队列削峰(RocketMQ/Kafka),Redis预扣库存(Lua脚本保证原子性)
数据库层面:数据库最终扣减库存,行锁优化,分库分表
兜底策略:降级(返回友好提示)、熔断(服务不可用时的保护)
加分回答:提到“热点数据问题”——可以用Redis集群,或者把库存分散到多个key上。
7. “哪些排序算法是稳定的?快排稳定吗?”
这道题经常被忽略,但面试官喜欢问。
常见排序稳定性:
稳定:冒泡、插入、归并、计数、桶、基数
不稳定:选择、快排、希尔、堆排序
加分回答:解释一下“稳定性”的意义——比如对“成绩表”先按分数排序,再按姓名排序,稳定排序能保证分数相同时名字的顺序不变。
8. “Redis为什么快?”
这道题不要只答“基于内存”。
完整回答:
纯内存操作,读写速度快
单线程模型,避免了上下文切换和锁竞争(6.0之后多线程只用于网络IO)
I/O多路复用,能同时处理大量客户端连接
高效的数据结构(SDS、跳表、压缩列表等)
加分回答:可以对比Memcached——Memcached是多线程,适合多核,但每个请求的CPU开销更大;Redis单线程反而减少了锁开销。
四、综合题
9. “说说你的一个项目亮点”
这道题看似开放,实则最容易暴露问题。很多人答成“项目介绍”。
正确的回答结构(STAR原则):
Situation:项目背景是什么?遇到了什么问题?
Task:你的任务是什么?
Action:你采取了什么技术方案?为什么选这个方案?有没有对比过其他方案?
Result:最终结果怎么样?有没有量化数据(如QPS从500提升到2000,响应时间从2s降到300ms)
加分回答:能说出踩过的坑以及怎么解决的。比如“刚开始用Redis缓存,发现缓存穿透,后来加了布隆过滤器……”
10. “你有什么想问我的?”
这是面试的最后一题,很多人说“没有”就结束了。
建议反问的问题:
“这个岗位目前团队最大的挑战是什么?”
——体现你有解决问题的意愿“团队的技术栈和开发流程是怎样的?”
——体现你对技术有追求“我对xx技术比较感兴趣,公司有相关的实践机会吗?”
——体现你有学习主动性
不要问:加班多吗?包吃吗?(这些可以问HR)
五、一些提醒
不用每题都答得完美,面试官主要想看到你的思路和应变能力
不会的题直接说不会,不要编,可以尝试说“虽然我没用过,但根据我的理解可能是……”
手写代码时说话,把思路说出来,写错了也比沉默强
简历上的每一个字都要负责,写在“熟悉”的内容被问倒,会直接扣分
六、面试常见问题速查表
| 模块 | 高频考点 | 重点程度 |
|---|---|---|
| Java基础 | HashMap、JVM内存模型、垃圾回收、多线程锁 | ⭐⭐⭐⭐⭐ |
| Spring | AOP原理、循环依赖、事务失效、Bean生命周期 | ⭐⭐⭐⭐⭐ |
| MySQL | 索引优化、事务隔离级别、MVCC、explain | ⭐⭐⭐⭐⭐ |
| Redis | 持久化、缓存雪崩/穿透/击穿、分布式锁 | ⭐⭐⭐⭐ |
| 消息队列 | 如何保证消息不丢失、顺序消费、重复消费 | ⭐⭐⭐⭐ |
| 算法 | 二分查找、快排、链表反转、LRU | ⭐⭐⭐⭐ |
🎁 写在最后
面试这件事,七分靠实力,三分靠表达。上面的10道题,建议你自己对着镜子练一遍,不是背答案,是学会“面试官想听什么”。
祝你顺利拿到心仪的offer。
另外,我自己整理了一批程序员简历模板,包含Java后端、Web前端、C++、数据科学等方向,还有应届生和社招两个版本。有需要的朋友可以免费下载:
资料下载: https://pan.quark.cn/s/45c9a17b9f29 https://pan.baidu.com/s/1mfkr6y8cTeRIB4m4rNJZuw?pwd=8888(如果链接失效,可以私信我补链)
最后送大家一个福利:
如果你想系统地准备面试,推荐几个我常看的学习资源:
LeetCode:刷题必备,建议按tag刷,不要随机刷
《Java并发编程实战》:面试必考,尤其是AQS、锁、线程池
《高性能MySQL》:索引优化那几章反复看
