ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Java后端面试一周冲刺:高频考点自测清单与每日复习计划

Java后端面试一周冲刺:高频考点自测清单与每日复习计划 如果今天就是 8 月 11 日距离 Java 后端面试还剩一周你的第一反应是不是打开八股文合集从 HashMap 一路背到分布式锁先停一下。一周时间最怕的不是题不会而是复习节奏失控今天翻 JVM明天翻 Spring后天收藏了一堆面经到最后哪一块都没形成稳定的答题框架。真正的冲刺方式是把高频考点按专题压缩成 100 道左右的自测题每道题做到“能讲原理、能写代码、能扛追问”而不是“看着眼熟、一开口就断片”。这篇文章就按这个思路设计。我按 Day1 到 Day7 给了每天的知识点专题、每专题的高频题自测清单、经典题目的答法框架以及一套可以直接用的自我介绍和反问模板。文末还附了一周冲刺常见的复习问题和排查方式。适合正在准备后端校招或社招、需要快速把知识体系梳理到“可面试状态”的 Java 开发者。先说清楚这不是系统教学也不会让一个零基础的人七天成为 Java 后端工程师。它的作用是帮你把已经学过、但还没串成体系的知识压缩成面试官高频考察的考点然后在面试现场用最短的时间表达出来。1. 核心复习清单速览项目说明内容定位Java 后端面试高频考点自测清单非体系化课程题量范围100 道左右按专题压缩题复习周期7 天每天一个大专题技术栈覆盖Java 基础、集合、JVM、并发、Spring、Spring Boot、MyBatis、MySQL、Redis、消息队列、分布式、网络、Linux准备前提已掌握 Java 基础能独立跑通一个 Spring Boot 项目完成标准每个专题能脱离资料复述原理并能手写关键代码片段适合场景后端校招/社招冲刺、知识查漏补缺、模拟面试前梳理不适用场景零基础入门、系统学习 Java、代替真实项目经验一周 100 题不是让你机械地背答案。面试官考察的从来不是“这道题标准答案第几句是什么”而是你对核心原理是否理解、能不能结合项目讲清楚、被追问时会不会慌。把 100 道高频题练到能随口讲清楚比泛泛刷 300 道然后全部遗忘要有效得多。从时间分配上看可以按这样安排天数复习专题Day1Java 基础、集合Day2JVM、并发Day3Spring、Spring Boot、MyBatisDay4MySQL 基础、索引、事务Day5Redis 与缓存场景Day6消息队列、分布式、网络、LinuxDay7项目复盘、HR 面、模拟面试2. 适用场景与复习边界这份计划好在哪好在它把 Java 后端的知识面切成了面试官真正会问的模块。你不需要把《Java 编程思想》从头翻到尾也不需要看完一个几十小时的微服务实战课程只需要集中解决“面试现场最容易被问到”的内容。它适合这几类人校招学生已经学过 JavaSE 和 Spring Boot想在一到两周内把知识串成体系社招开发者项目经验有但基础题答得不够系统需要快速补八股文表达准备转 Java 后端的开发者之前用其他语言需要了解 Java 后端的核心概念和回答思路。它不适合零基础的人。如果连 JDK 都没装过、没写过接口、没连过数据库七天时间应该去跑一个完整项目而不是刷题。也有几条边界需要提前说清楚不要背题。面试官追问两句就能判断你是不是死记硬背理解之后用自己的话讲出来才有区分度。不要找代面试不要作弊诚信是底线。不要在网上收集所谓“最新大厂面试原题”外传很多内容涉及对方公司的保密信息尊重规则就是保护自己。刷题复习是为了提升能力不是保证 offer。面试结果还取决于岗位匹配度、项目经验、沟通表达和临场状态不要被“七天稳稳拿 offer”这类话术绑架。3. 环境准备先检查这三样刷题阶段最容易被忽略的是本地环境。很多考点只看不跑一到面试写代码就手生。建议在正式开始前检查三样东西。第一JDK 和构建工具。优先使用项目里的版本常见是 JDK 8、11 或 17。在终端确认版本java -version mvn -version如果电脑上装了多个 JDK记得确认 IDEA 里 Project Structure 和 Maven 的 JDK 设置一致。很多“代码本地能跑、面试时忘了怎么配”的问题都出在环境不熟。第二MySQL 和 Redis。面试会问索引、锁、事务、缓存穿透光背不够最好本地能实际执行命令看效果。先确认服务状态mysql -uroot -p redis-cli pingSpring Boot 默认端口是 8080MySQL 是 3306Redis 是 6379。如果起服务时遇到端口占用可以用下面的命令排查lsof -i :8080然后根据情况改端口或停掉旧进程。第三Postman 或 curl。用于验证接口是否通、状态码是什么、慢查询场景怎么模拟。面试官问“线上接口变慢怎么排查”时你如果能说出从接口层到数据库层的排查链路会比只背答案更有说服力。环境准备的目的是让“写代码验证”这个动作成本足够低。后面每一天的专题都值得配一个小示例跑一遍。4. 第 1-2 天Java 基础、集合与并发前两天是基础题的重灾区。Java 基础、集合和并发三块经常会混在一起问所以放在同一个冲刺阶段处理。4.1 高频题自测清单Java 基础与集合约 15 题HashMap 底层数据结构、put 流程、扩容机制、JDK7 与 JDK8 的差异。HashMap 为什么线程不安全多线程下会出现什么问题。ConcurrentHashMap 在 JDK7 与 JDK8 的实现区别。ArrayList 和 LinkedList 的区别及适用场景。HashSet 与 LinkedHashSet、TreeSet 的内部实现。equals 与 hashCode 的约定重写时要注意什么。String、StringBuilder、StringBuffer 的区别。深拷贝与浅拷贝的区别数组和对象如何实现深拷贝。泛型是什么类型擦除是怎么回事通配符的上界下界。反射的应用场景为什么说反射效率低。JDK 动态代理与 CGLIB 动态代理的区别。Java 异常体系受检异常与非受检异常、finally 在什么情况下不执行。序列化时 transient 关键字的作用serialVersionUID 有什么用。Java 8 新特性Lambda、Stream、Optional、方法引用。Java 11 / Java 17 新特性你了解哪些。JVM 与并发约 18 题volatile 的可见性和禁止指令重排为什么不能保证原子性。synchronized 的锁升级过程。ReentrantLock 与 synchronized 的区别。AQS 的核心原理。ThreadLocal 原理与内存泄漏场景。线程池核心参数、任务执行流程、拒绝策略。为什么要用线程池为什么不建议直接用 Executors。CAS 原理与 ABA 问题。CountDownLatch、CyclicBarrier、Semaphore 的区别。CompletableFuture 的常用方法。JVM 内存区域哪些线程私有哪些线程共享。对象创建过程与对象内存布局。如何判断对象可被回收GC Roots 有哪些。垃圾回收算法标记-清除、标记-复制、标记-整理。CMS 和 G1 收集器的特点。类加载过程双亲委派模型。强引用、软引用、弱引用、虚引用。内存溢出和内存泄漏的区别线上 OOM 怎么排查。4.2 经典题展开HashMap 面试答法HashMap 是 Java 后端面试的必考题几乎没有人能绕开。面试官一般不会只问“HashMap 的底层结构是什么”而是会从 put 流程一路追问到扩容和线程安全问题。建议的答题顺序是先讲底层结构再讲 put 流程最后讲扩容和线程安全。不要一上来就背源码面试官要的是结构化表达。底层结构可以这样组织JDK8 的 HashMap 是数组 链表 红黑树。默认初始容量是 16负载因子是 0.75。当链表长度超过 8 且数组长度大于等于 64 时链表转红黑树。put 流程可以这样描述// JDK 8 HashMap putVal 核心步骤示意 // 1. 计算 hash(h key.hashCode()) ^ (h 16) // 2. 如果 table 为空先执行 resize // 3. 计算桶下标(n - 1) hash // 4. 如果该桶为空直接插入新节点 // 5. 如果桶不为空比较 hash 和 key相同则覆盖 // 6. 如果桶节点是 TreeNode走红黑树插入 // 7. 如果是链表遍历链表尾部插入链表长度超过 8 且数组长度 64 时转红黑树 // 8. 插入完成后size 超过 threshold 时扩容最后讲线程安全为什么不行如果两个线程同时 put都发现桶为空然后同时插入会覆盖数据JDK7 头插法在并发扩容时还可能形成环形链表导致 get 死循环。JDK8 改成尾插法但并发覆盖问题仍然存在所以多线程场景要用 ConcurrentHashMap。4.3 经典题展开synchronized 与 volatile这是一组对比题回答时要先说清楚它们各自解决什么问题再放到一起比较。synchronized 是互斥锁通过监视器锁保证临界区同一时刻只有一个线程执行同时具备可见性、原子性和有序性。volatile 只保证可见性和禁止指令重排不保证原子性。对比项synchronizedvolatile主要作用互斥、可见性、原子性可见性、禁止指令重排是否阻塞会阻塞但存在锁升级不阻塞原子性保证临界区原子性不保证复合操作原子性适用场景临界区、复合操作状态标志、单例双重检查回答时最好的例子是双重检查锁单例。这个例子可以把 volatile、synchronized、指令重排三个考点串起来public class Singleton { private static volatile Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance null) { synchronized (Singleton.class) { if (instance null) { instance new Singleton(); } } } return instance; } }这里的关键是instance new Singleton()并不是一个原子操作它分为分配内存、初始化对象、把引用赋值给变量三步。如果不加 volatileJVM 可能重排为分配内存、把引用赋值给变量、再初始化对象。那么另一个线程在读instance时可能拿到一个还没初始化的对象。加了 volatile 后通过内存屏障禁止了这种重排。4.4 经典题展开线程池线程池是并发题里最容易被连续追问的考点。一个完整的回答需要包含四层为什么用线程池、核心参数有哪些、任务提交后怎么流转、拒绝策略有哪些。先给一个标准构造器示例ThreadPoolExecutor executor new ThreadPoolExecutor( 2, // corePoolSize 核心线程数 4, // maximumPoolSize 最大线程数 60L, TimeUnit.SECONDS, // 非核心线程空闲存活时间 new ArrayBlockingQueue(100), // 工作队列 Executors.defaultThreadFactory(), // 线程工厂 new ThreadPoolExecutor.CallerRunsPolicy() // 拒绝策略 );任务执行流程要能背清楚核心线程未满时直接创建核心线程执行任务核心线程已满任务进入队列等待队列满了创建非核心线程执行任务最大线程数也满了执行拒绝策略。拒绝策略有四种AbortPolicy 直接抛异常CallerRunsPolicy 由提交任务的线程自己执行DiscardPolicy 直接丢弃任务DiscardOldestPolicy 丢弃队列里最老的任务。平时不建议直接用 Executors 创建线程池是因为它可能使用无界队列导致 OOM或者最大线程数设置为最大值带来风险。更稳妥的做法是手动 new ThreadPoolExecutor 并明确参数。5. 第 3 天Spring、Spring Boot 与 MyBatisSpring 是 Java 后端的核心也是一周复习里需要花不少时间整理表达的部分。这一天的重点不是把 Spring 源码读通而是把高频面试题的答题框架练熟。5.1 高频题自测清单Spring 与 Spring Boot约 12 题什么是 IOC和 DI 是什么关系。Bean 的作用域有哪些默认是什么。Bean 的生命周期。Spring 如何解决循环依赖。AOP 的使用场景Spring AOP 与 AspectJ 的区别。Spring AOP 中 JDK 动态代理与 CGLIB 如何选择。Autowired 和 Resource 的区别。Spring Boot 自动配置原理。自定义 Starter 的步骤。Transactional 什么时候会失效。Spring 事务的传播行为有哪些。Spring MVC 的执行流程。MyBatis约 4 题MyBatis 中 #{} 和 ${} 的区别。MyBatis 一级缓存和二级缓存。MyBatis 接口代理如何实现 Mapper 接口。MyBatis 与 MyBatis-Plus 常用注解与功能差异。5.2 经典题展开Spring 循环依赖这是 Spring 题里最常卡壳的一道。很多人知道“三级缓存”但说不清为什么需要三级缓存也说不清三级缓存里分别放了什么。一个参考答案框架Spring 解决循环依赖依靠的是三级缓存。第一级singletonObjects存放完整创建好的单例 Bean第二级earlySingletonObjects存放提前暴露的早期 Bean 引用这些 Bean 的属性还没有完全填充第三级singletonFactories存放工厂用来生成 Bean 的早期引用它的核心是getEarlyBeanReference。为什么需要三级缓存因为 A 依赖 BB 依赖 A创建 A 时发现需要 B于是去创建 BB 创建时又发现需要 A。如果只用两级缓存A 即使提前暴露了对象也没办法在这个阶段完成 AOP 代理的创建。第三级缓存允许在需要早期引用时才通过工厂方法生成代理对象从而兼顾循环依赖和 AOP。注意两个限制循环依赖只对单例 Bean 有效原型作用域的 Bean 不支持如果依赖的是构造器注入Spring 无法通过三级缓存解决因为对象还没实例化就陷入了循环。5.3 经典题展开Transactional 失效场景这道题的套路在于面试官会先问“你在项目里怎么用事务”然后追问“什么情况下事务会失效”。失效场景不需要背全部但要说清原理。常见失效场景包括方法不是 publicSpring 默认用 CGLIB 或 JDK 代理非 public 方法无法被代理增强。同类内部调用A 类方法调用同类 B 方法事务注解没有经过代理对象所以不生效。自调用问题本质同上this.method()绕过代理要通过 Spring 容器拿到代理对象再调用。异常被 catch 掉了事务感知不到异常自然不会回滚。抛出受检异常但没配置 rollbackFor默认只回滚 RuntimeException 和 Error。数据库引擎不支持事务比如 MyISAM 不支持 InnoDB 的事务能力。事务传播行为设置成了 NOT_SUPPORTED会让方法在非事务状态下执行。答题时建议先说“事务的本质是 AOP 代理增强”然后列举场景这样每个失效场景都能用同一个原理解释。5.4 经典题展开Spring Boot 自动配置原理自动配置的底层是条件注解加配置类加 META-INF 下的 spring.factories 文件或 AutoConfiguration.imports。Spring Boot 启动时会根据当前项目的依赖和配置判断条件是否满足然后自动创建对应的 Bean。答这个题可以分三步第一步SpringBootApplication 是 EnableAutoConfiguration、SpringBootConfiguration、ComponentScan 的组合。第二步EnableAutoConfiguration 会通过 AutoConfigurationImportSelector 加载自动配置类列表。第三步自动配置类上通常有 ConditionalOnClass、ConditionalOnMissingBean 等条件注解满足条件才创建 Bean。Configuration ConditionalOnClass(SomeService.class) public class SomeAutoConfiguration { Bean ConditionalOnMissingBean public SomeService someService() { return new SomeService(); } }上面是一个自动配置类示意实际项目里不需要自己写明白这个链路就能撑住追问。面试官如果继续问“你怎么自定义 Starter”就回答创建一个自动配置类加上条件注解然后在 resources/META-INF 下声明自动配置类的全限定名。6. 第 4-5 天MySQL、Redis 与缓存场景数据库和缓存基本是 Java 后端面试里占比重最大的两块。平时做项目时你可能不太关注索引原理但面试题几乎都从这里出。6.1 高频题自测清单MySQL约 12 题InnoDB 与 MyISAM 的主要区别。为什么 InnoDB 使用 BTree不适用 Hash、红黑树。聚簇索引与非聚簇索引。覆盖索引与回表查询。最左前缀原则联合索引字段顺序怎么设计。事务 ACID 特性分别怎么保证。事务隔离级别MySQL 默认隔离级别。MVCC 原理快照读与当前读。行锁、间隙锁、临键锁、表锁。SQL 优化的一般步骤。EXPLAIN 执行计划里 type、key、rows 怎么看。主从复制原理主从延迟怎么处理。Redis约 10 题Redis 基本数据结构与底层实现比如 SDS、跳表、压缩列表。Redis 为什么快为什么单线程还快。RDB 与 AOF 的区别如何选择。缓存穿透、击穿、雪崩的定义与解决方案。分布式锁怎么实现Redisson 的作用。Redis 过期删除策略与内存淘汰策略。主从复制、哨兵、集群模式。大 Key 和热 Key 问题。缓存与数据库一致性怎么做。Redis 6.0 引入多线程了吗。6.2 经典题展开最左前缀原则与索引失效最左前缀原则是 MySQL 索引考点中最容易翻车的题。记不住口诀没关系拿一个联合索引实际跑一下 EXPLAIN比背十遍都有效。比如建一个联合索引CREATE INDEX idx_user_name_age ON user (name, age);下面这条 SQL 会走索引因为它从最左边的 name 字段开始SELECT * FROM user WHERE name test AND age 18;下面这条 SQL 不会走这个联合索引因为它跳过了 name直接从 age 开始SELECT * FROM user WHERE age 18;下面这条 SQL 也会走索引但只能用上 name 这一段age 段用不上SELECT * FROM user WHERE name test AND age 20;回答时要扩散到索引失效的常见场景对索引列使用函数或计算、隐式类型转换、like 以通配符开头、使用 or 连接非索引列条件。记住一个原则索引优化最后一定要用 EXPLAIN 验证不要凭感觉。6.3 经典题展开缓存三大问题缓存穿透、击穿、雪崩必须背清楚因为它们基本是绑定出现的。答题时建议先用一句话定义再说解决方案。问题一句话定义常见解决方案缓存穿透查询一个不存在的数据请求打到数据库缓存空值、布隆过滤器、参数校验缓存击穿热点 key 过期瞬间大量请求打到数据库互斥锁、逻辑过期、热点 key 不过期缓存雪崩大量 key 同一时间过期数据库压力陡增过期时间加随机值、多级缓存、限流降级面试官很可能继续追问“那你项目里缓存和数据库一致性怎么保证”。这个问题没有标准答案但要说清常见方案和取舍。比较常用的思路是先更新数据库再删除缓存或者使用延迟双删策略。难点在并发场景下数据库更新和缓存删除之间可能存在时间窗所以很多团队会用消息队列或 Canal 做异步删除。6.4 本地验证时怎么观察 MySQL 慢查询和 Redis 内存这部分建议第二天实际跑一遍。MySQL 开启慢查询日志可以让你把测试 SQL 的耗时真实拉出来SET GLOBAL slow_query_log ON; SHOW VARIABLES LIKE slow_query_log%;观察 Redis 内存和大 keyredis-cli INFO memory redis-cli --bigkeys如果面试题问你“线上 Redis 内存涨了怎么办”你至少能说出用 INFO memory 看 used_memory用 --bigkeys 扫描大 key再根据淘汰策略和过期时间处理。7. 第 6 天消息队列、分布式、网络与 Linux第 6 天的内容看着多其实不需要每个人都精通全部。根据你的项目和目标岗位挑重点复习。7.1 高频题自测清单消息队列约 5 题为什么引入 MQ解耦、异步、削峰分别指什么。消息丢失有哪些环节生产端、服务端、消费端如何保证。重复消费怎么处理幂等性如何设计。顺序消息如何实现。消息堆积怎么排查和处理。分布式与微服务约 8 题CAP 理论BASE 理论。分布式事务2PC、TCC、本地消息表。分布式 ID 生成方案。注册中心Nacos 与 Eureka 的区别。网关的作用是什么。熔断、降级、限流的区别。接口幂等性有哪些实现方案。分布式链路追踪了解吗例如 Sleuth 与 Zipkin、SkyWalking。网络与 Linux约 8 题TCP 三次握手、四次挥手为什么挥手要四次。HTTP 与 HTTPS 的区别。HTTP 1.0 / 1.1 / 2.0 有哪些变化。常见 HTTP 状态码。Cookie、Session、Token 的区别。TCP 与 UDP 的区别。Linux 常用命令查看进程、查看端口、查看日志。线上 CPU 飙高怎么排查。7.2 经典题展开线上 CPU 飙高排查过程这是一道综合性很强的题目也是分布式和 Linux 知识的交叉考点。面试官想听的是一套完整的排查链路而不是单个命令。首选通过 top 命令查看哪个进程 CPU 占用高top然后显示该进程的线程维度 CPU 占用top -Hp pid把线程 ID 转成十六进制再用 jstack 导出线程栈找到对应线程在干什么printf %x\n tid jstack pid thread_dump.log最后在 dump 文件中搜索线程 id结合代码定位。如果发现大量 GC 线程就继续用 jstat 查看 GC 情况jstat -gcutil pid 1000答题要点是先看 CPU再看线程再看线程栈最后结合 GC 和代码定位。能把这个链路讲清楚即使没经历过真实线上故障也能给面试官留下好印象。7.3 经典题展开TCP 四次挥手四次挥手不难但要讲清楚每条消息的作用。主动关闭方发送 FIN表示数据发送完毕被动关闭方回复 ACK被动关闭方处理完数据后也发送 FIN主动关闭方再回复 ACK连接正式关闭。为什么最后要把 ACK 发完才能关闭因为被动关闭方不一定马上能发送 FIN它可能还有数据要处理所以 ACK 和 FIN 不能合并成一次。这也正是“挥手需要四次”的原因。8. 第 7 天项目复盘、HR 面与模拟面试最后一天不要再学新知识。这个阶段最值钱的动作是把项目经历整理成能讲 5 分钟的故事然后做两轮模拟面试。8.1 项目经验怎么讲STAR 法则面试官问“介绍一下你的项目”最怕听到流水账我用 Spring Boot 写了一个后台管理系统有用户管理、订单管理然后登录注册用 JWT……流水账没有信息量。更有效的框架是 STARSituation项目背景解决了什么业务问题。Task你在这个项目里的职责。Action你具体做了什么用了哪些技术遇到了什么难点。Result结果如何最好有数据比如接口响应时间下降了多少、支撑了多少并发。给一个最短的自我介绍框架可以背下来再用自己的内容填充面试官你好我叫 XXX有 X 年 Java 后端开发经验。最近一个项目是 XXX主要面向 XXX 业务场景。我负责的是订单核心链路包括订单创建、库存扣减和支付回调。这个项目里有三个难点一是高并发下库存超卖我用了 Redis 分布式锁加数据库乐观锁解决二是支付回调接口的幂等性我用状态机和唯一订单号保证三是慢 SQL 优化把一个核心查询从 800ms 降到 150ms。具体来说……这个模板的关键在于每个难点都能继续拆成背景、方案、结果三个小点。8.2 高频项目问题清单准备项目复盘时把下面这些问题提前写下答案项目里最难的技术点是什么怎么解决的。数据库表怎么设计的为什么这么设计。缓存和数据库一致性怎么做。接口幂等怎么做的。如果线上接口突然变慢你从哪些方向排查。项目上线后有没有出过故障怎么处理的。如果重新做一次这个项目哪些地方会改进。注意写答案的时候不要只写技术结论要写“当时的思考过程”。面试官更看中你的判断和取舍而不是结果本身。8.3 行为面试与反问行为面试听起来虚但很容易因为一两句话翻车。高频问题比如“为什么离开上一家公司”回答原则是正向表达不要说老东家坏话可以说职业发展空间、技术方向匹配等。再比如“你的职业规划是什么”不要只说“想当架构师”可以结合目标岗位说想深入做某一块比如高并发系统、中间件研发等。反问环节常被忽略。建议准备两三个真正关心的问题团队目前的核心技术栈是什么这个岗位主要负责哪块业务团队的新人培养和晋升机制是怎样的不要问“加班多不多”“能不能远程”这类问题至少在反问环节前段先问业务和技术后段再考虑其他问题。9. 一周冲刺常见问题排查与最佳实践这一节把复习过程中最常见的“卡点”整理成一张排查表。遇到问题先看现象再找原因不要盲目焦虑。问题现象可能原因处理方式背了就忘只记结论没理解原理每道题画图或写最小代码示例用自己的话复述HashMap 答不完一上来就背源码流程先讲底层结构再讲 put 流程最后讲扩容和线程安全Spring 循环依赖答不清只记得三级缓存名字先说为什么需要三级缓存再说三级缓存各自放什么MySQL 索引题不会缺乏联合索引场景感建一个联合索引实际执行 EXPLAIN 看效果项目经历讲不深缺少数据和取舍细节提前准备 3 个技术故事每个能
返回列表