ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Java后端面试一周冲刺:高频考点与复习计划

Java后端面试一周冲刺:高频考点与复习计划 如果你正在准备 Java 后端面试但时间只剩下大约一周心里没底不知道从哪里下手那这篇文章就是给你准备的。市面上 Java 面试题资料非常多但大多零散、重复、没有优先级反而容易让人越看越慌。本文会按照“8月11日开始”这个时间点给你拆出一份完整的一周冲刺计划把大厂 Java 后端面试最高频的 100 道题按模块分类覆盖 Java 基础、集合、并发、JVM、Spring、MySQL、Redis、消息队列、算法、项目表达等核心板块并且给出代码示例、避坑思路和复习顺序。不管你是学生准备秋招还是工作后想跳槽只要按这个节奏执行一周时间也能把 Java 后端面试的高频考点系统过一遍。1. 背景与核心概念Java 后端面试到底考什么1.1 大厂 Java 后端面试的考察范围先说结论Java 后端面试不是单纯考“Java 语法背得多熟”而是考察你能不能从“会用”上升到“懂原理”。一个典型的 Java 后端面试流程通常包含以下几类内容考察板块常见问题考察目的Java 基础面向对象、String、异常、反射、泛型语言功底是否扎实Java 集合ArrayList 和 LinkedList 区别、HashMap 原理对常用数据结构的掌握程度Java 并发synchronized、volatile、线程池、CAS是否写过并发代码是否理解线程安全JVM内存区域、垃圾回收、类加载、OOM排查线上问题的基础能力SpringIOC、AOP、Bean 生命周期、事务传播后端框架的核心理解Spring Boot自动装配、starter、配置文件加载顺序实际项目开发能力MySQL索引、事务隔离级别、锁、SQL 优化数据层设计能力Redis数据类型、缓存穿透/击穿/雪崩、持久化缓存场景落地能力消息队列RocketMQ/Kafka 使用场景、消息丢失分布式系统设计意识计算机网络TCP 三次握手、HTTP 与 HTTPS、DNS后端排查网络问题的基本功算法排序、链表、二叉树、动态规划编码基本功项目项目架构、难点、亮点、线上故障综合解决问题的能力可以看出Java 后端面试覆盖面很广但并不意味着每个点都要背得一字不差。面试官更希望听到“你知道为什么这样设计”的回答而不是纯粹背八股文。1.2 “一周冲刺”是否可行一周时间并不长但如果你目标明确、资料聚焦完全可以把高频考点过一遍。关键是避免两种错误做法漫无目的地刷题今天看 JVM明天看 Redis最后什么都没记住。只背答案不理解原理面试官稍微追问一句“为什么”就卡壳。正确做法是把一周拆成固定模块每天集中突破一个主题配合手写代码和项目复盘把 100 道高频题分成 7 组每天 15 道左右做到“能说出来、能写出来、能解释清楚”。1.3 本文适合哪些读者准备校招、秋招的 Java 方向学生需要短期梳理面试考点。准备跳槽的初级后端开发想快速回顾基础知识。自我感觉基础不牢固希望有一套系统复习清单的开发者。如果你已经能熟练使用 Spring Boot 完成 CRUD 项目但一到面试就被问到原理这一周计划对你尤其重要。2. 一周冲刺时间规划与准备清单2.1 建议时间表以下时间表以 8月11日周一为起点假设你有连续 7 天时间。如果白天需要上班或上课可以把内容拆到晚上和周末核心是“每天一个主模块 少量算法”日期主攻模块当天目标8月11日 Day1Java 基础 集合过完基础语法考点手写 ArrayList/HashMap 相关原理说明8月12日 Day2Java 并发 JVM背熟 synchronized/volatile/线程池搞懂 JVM 内存与 GC8月13日 Day3Spring Spring Boot梳理 IOC/AOP/Bean 生命周期/自动装配8月14日 Day4MySQL Redis索引、事务、缓存三兄弟8月15日 Day5计算机网络 Linux 消息队列高频网络题 常用排查命令8月16日 Day6算法手写 项目复盘每天手写 2-3 个算法打磨项目表达8月17日 Day7全量串讲 模拟面试把 100 题整体过一遍查漏补缺每天建议保持 6-8 小时有效学习时间不要追求 12 小时低效硬扛效率比时长重要。2.2 学习资料准备一份 Java 面试题库网上很多重点看高频题分类。Java 核心技术相关的书籍或笔记例如《Java 编程思想》《深入理解 Java 虚拟机》不必全读看重点章节即可。一个可以运行 Java 代码的 IDE推荐 IntelliJ IDEA。本地安装 JDK 8 或 JDK 11用于验证代码。一个空白的 Markdown 笔记文件用来记录每天的高频题答案框架。2.3 复习原则先框架后细节先知道这个模块有哪些考点再逐个深入。先原理后背诵理解原理后用自己的话表达一遍。先高频后冷门时间不够就优先准备高频题冷门题看个眼熟即可。先代码后概念算法和并发题一定要动手写代码。3. Java 核心知识集合、并发、JVM3.1 Java 集合高频题集合是 Java 面试必考模块尤其是 HashMap。高频题目ArrayList 和 LinkedList 区别。HashMap 底层数据结构是什么。HashMap 和 Hashtable 区别。ConcurrentHashMap 如何保证线程安全。HashSet 底层如何实现去重。关于 HashMap面试官最爱问的是“JDK 1.8 中 HashMap 的结构变化”。简单回答模板JDK 1.8 之前HashMap 采用数组 链表结构。JDK 1.8 之后HashMap 采用数组 链表 红黑树结构。当链表长度超过阈值 8并且数组长度大于等于 64 时链表会转为红黑树。红黑树节点数减少到 6 时会退化为链表。为了加深理解可以自己写一个简单的 HashMap put 流程模拟不一定照搬源码重点记录 hash 计算、寻址和冲突解决思路。3.2 Java 并发高频题并发是面试的分水岭也是最容易暴露基础薄弱的地方。建议重点掌握以下内容synchronized 和 ReentrantLock 的区别。volatile 能保证什么不能保证什么。线程池核心参数有哪些。ThreadLocal 原理与内存泄漏问题。CAS 是什么ABA 问题如何解决。CountDownLatch 和 CyclicBarrier 区别。线程池参数是最常考的面试官可能会直接问如果一个任务提交到线程池线程池的处理流程是什么处理流程如下当提交一个新任务时如果当前运行的线程数小于 corePoolSize创建新线程处理任务。如果线程数已经达到 corePoolSize任务会进入阻塞队列等待。如果队列也满了并且线程数小于 maximumPoolSize则创建非核心线程处理任务。如果线程数已经达到 maximumPoolSize则执行拒绝策略。下面是一个简单的线程池使用示例import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; public class ThreadPoolDemo { public static void main(String[] args) { ThreadPoolExecutor executor new ThreadPoolExecutor( 2, // corePoolSize 4, // maximumPoolSize 60L, // 空闲线程存活时间 TimeUnit.SECONDS, new ArrayBlockingQueue(10), // 阻塞队列容量 new ThreadPoolExecutor.AbortPolicy() // 拒绝策略 ); for (int i 0; i 10; i) { final int taskId i; executor.execute(() - { System.out.println(Thread.currentThread().getName() 执行任务 taskId); }); } executor.shutdown(); } }这段代码演示了线程池最基本的创建和任务提交方式。实际项目中更推荐使用Executors创建特定类型的线程池但要特别注意Executors.newFixedThreadPool底层使用的LinkedBlockingQueue是无界队列如果任务积压太多可能导致内存压力上升所以大厂面试往往会追问“为什么不建议使用 Executors 的默认方法创建线程池”。3.3 JVM 高频题JVM 在面试中主要考察三个方面内存区域、垃圾回收、类加载。内存区域可以这样记线程私有虚拟机栈、本地方法栈、程序计数器。线程共享堆、方法区JDK 1.8 后为元空间。垃圾回收算法高频点标记-清除算法。标记-复制算法。标记-整理算法。分代收集理论。面试官常问什么时候会触发 Minor GC 和 Full GC简单回答Minor GC 发生在新生代Eden 区空间不足时触发。Full GC 发生在老年代可能是老年代空间不足、元空间不足、或者显式调用 System.gc() 等情况触发。OOM 问题是后端面试的高频场景题例如题目会问如果线上出现java.lang.OutOfMemoryError: Java heap space你会怎么排查常用排查步骤通过jps查看 Java 进程 PID。使用jmap -dump:formatb,fileheap.bin pid导出堆快照。使用 MAT 或 JVisualVM 分析大对象。检查代码中是否有大量对象无法被回收例如集合对象未清空。必要时调整 JVM 堆参数但根本解决要改代码。注意导出堆快照在生产环境需要谨慎最好在低峰期操作同时确保操作有授权避免影响线上服务。4. Spring 与 Spring Boot 高频考点4.1 IOC 和 AOPIOCInversion of Control控制反转是 Spring 的核心思想将对象的创建和依赖管理交给容器而不是在代码里手动 new。AOPAspect Oriented Programming面向切面编程解决的是横切逻辑重复问题例如日志、事务、权限校验。面试常见问题Spring Bean 的生命周期是什么Spring Bean 默认是单例还是多例AOP 有哪些通知类型Spring 事务传播行为有哪些Bean 生命周期可以概括为实例化 - 属性赋值 - 初始化 - 使用 - 销毁。更完整的流程包含 BeanPostProcessor 的前后处理但面试时先答主流程再补充关键扩展点即可。4.2 Spring Boot 自动装配原理Spring Boot 最大的优势是自动装配。面试题通常这样问为什么引入一个 starter 依赖后不需要写一堆配置就能直接使用核心原因在于SpringBootApplication注解组合了以下注解SpringBootConfigurationEnableAutoConfigurationComponentScan其中EnableAutoConfiguration会通过AutoConfigurationImportSelector加载META-INF/spring.factories或META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports中的自动配置类。通俗解释就是Spring Boot 启动时会扫描 classpath 下的依赖根据条件注解例如ConditionalOnClass、ConditionalOnMissingBean判断是否创建对应 Bean。4.3 Spring Boot 项目最小配置示例如果你在准备面试建议自己创建一个 Spring Boot 项目能帮助理解自动装配。pom.xml核心依赖片段parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version2.7.18/version relativePath/ /parent dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency /dependenciesapplication.yml核心配置示例server: port: 8080 spring: application: name: interview-demo注意版本号请以你的实际项目为准不同版本的 Spring Boot 自动装配机制可能有细微差异例如 2.4 之后配置文件加载规则发生了变化。4.4 事务失效的常见场景Spring 事务是高频考点特别是“事务失效”问题。面试官可能会问在同一个类中调用另一个方法事务会失效吗答案是通常会失效。原因是 Spring 事务基于 AOP 代理同类内部方法调用不会经过代理对象所以Transactional不生效。常见事务失效场景方法被private修饰。方法不是通过代理对象调用。异常被 catch 后没有抛出。抛出的是 checked exception而默认不回滚。数据库引擎不支持事务例如 MyISAM。解决方式将方法拆到不同 Bean 中。通过AopContext.currentProxy()获取当前代理对象。在 catch 中调用TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()手动标记回滚。5. MySQL 与 Redis数据层防翻车指南5.1 MySQL 索引MySQL 索引是后端面试必考内容尤其是 InnoDB 的 B Tree 索引。高频题目聚簇索引和非聚簇索引区别。最左前缀原则。覆盖索引是什么。为什么选择 B Tree而不是 B Tree 或 Hash。回答时可以这样说B Tree 的数据都存放在叶子节点并且叶子节点之间通过链表相连非常适合范围查询。InnoDB 主键索引是聚簇索引二级索引存储的是主键值所以查询非索引字段时会发生回表。一个简单的 SQL 示例演示联合索引CREATE TABLE user ( id BIGINT NOT NULL AUTO_INCREMENT, name VARCHAR(50) DEFAULT NULL, age INT DEFAULT NULL, email VARCHAR(100) DEFAULT NULL, PRIMARY KEY (id), KEY idx_name_age (name, age) ) ENGINE InnoDB;当执行SELECT * FROM user WHERE name 张三时可以命中idx_name_age索引。如果跳过 name 直接查 age则无法走索引这就是最左前缀原则。5.2 SQL 优化思路面试中经常给出一条慢 SQL问你如何优化。优化步骤可以按这个顺序使用 EXPLAIN 查看执行计划确认是否走索引。检查 WHERE 条件字段是否有索引。避免在索引列上使用函数或隐式类型转换。避免SELECT *只查需要的字段。大表分页可以用覆盖索引延迟关联。控制单表数据量必要时分库分表。5.3 Redis 缓存三兄弟Redis 高频考点非常固定缓存穿透查询一个不存在的数据每次请求都打到数据库。缓存击穿某个热点 key 过期瞬间大量请求打到数据库。缓存雪崩大量 key 同时过期导致数据库压力暴增。缓存穿透解决方案缓存空值并设置较短过期时间。布隆过滤器事前过滤不存在的 key。缓存击穿解决方案热点 key 不设置过期时间或使用逻辑过期。加互斥锁只允许一个线程去重建缓存。缓存雪崩解决方案key 过期时间加随机值。多级缓存。限流和熔断。下面是一个简单的 Redis Spring Boot 缓存示例思路Service public class UserCacheService { Autowired private StringRedisTemplate redisTemplate; public String getUserById(String userId) { String cacheKey user: userId; String value redisTemplate.opsForValue().get(cacheKey); if (value ! null) { return value; } // 模拟从数据库查询 String dbValue queryFromDb(userId); if (dbValue ! null) { redisTemplate.opsForValue().set(cacheKey, dbValue, 30, TimeUnit.MINUTES); } else { // 防止缓存穿透缓存空值 redisTemplate.opsForValue().set(cacheKey, , 3, TimeUnit.MINUTES); } return dbValue; } }这个示例能覆盖缓存基本用法和空值缓存思路。面试时如果提到缓存穿透能搭配这种代码表达会比单纯背概念好很多。6. 算法手写与数据结构的速刷方法6.1 高频算法题分类一周内不需要刷大量 LeetCode但高频题型必须过一遍。建议优先刷这几类题型代表题目面试频率排序冒泡排序、快速排序高链表反转链表、判断环很高二叉树层序遍历、最近公共祖先高字符串最长回文子串、无重复子串中高动态规划爬楼梯、斐波那契高栈和队列用栈实现队列、最小栈中6.2 手写冒泡排序与优化冒泡排序几乎是 Java 基础面试必考题面试官可能让你 5 分钟内手写出来。public class BubbleSort { public static void bubbleSort(int[] arr) { if (arr null || arr.length 2) { return; } int n arr.length; for (int i 0; i n - 1; i) { boolean swapped false; for (int j 0; j n - 1 - i; j) { if (arr[j] arr[j 1]) { int temp arr[j]; arr[j] arr[j 1]; arr[j 1] temp; swapped true; } } // 如果没有发生交换说明数组已经有序提前结束 if (!swapped) { break; } } } public static void main(String[] args) { int[] arr {64, 34, 25, 12, 22, 11, 90}; bubbleSort(arr); System.out.println(Arrays.toString(arr)); } }这段代码的优点在于加入了swapped标志位能够优化最好情况下的时间复杂度。面试时写出优化版本比写基础版本更有亮点。6.3 手写单例模式单例模式也是 Java 面试的高频代码题特别是双重检查锁写法和静态内部类写法。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; } }注意这里volatile关键字很关键它防止了指令重排序。如果没有volatile在多线程环境下可能拿到一个未完全初始化的对象。更推荐使用枚举方式实现单例简洁且线程安全public enum SingletonEnum { INSTANCE; public void doSomething() { System.out.println(do something); } }6.4 刷题节奏建议每天固定 2-3 道算法题不要贪多。第一遍先看思路第二遍再手写。写完后口头给自己讲一遍梳理时间复杂度和空间复杂度。重点记录“卡住的地方”面试前翻看。7. 项目实战从 0 讲清楚一个后端项目7.1 为什么项目表达很重要面试中算法和八股文只是敲门砖最终能否拿到 offer很大程度取决于项目表达。面试官会追问你的项目解决了什么问题架构怎么设计的遇到了什么难点如果项目是网上抄的回答时支支吾吾很容易被识破。一周内不要重新做一个新项目重点是把已有项目复盘清楚。7.2 用 STAR 法则整理项目推荐用 STAR 法则来整理项目描述S背景项目是什么面向什么场景。T任务你在项目中负责什么。A行动你具体怎么做的用了哪些技术。R结果最终效果如何重点写数据指标。例如一个前后端分离的后端接口项目可以这样表达“项目是一个 XX 管理系统后端采用 Spring Boot 提供 RESTful API前端使用 Vue。我负责后端模块设计包括用户认证、权限管理和订单模块。通过 Spring Security JWT 实现登录鉴权通过 Redis 缓存热点数据接口平均响应时间从 300ms 降到 80ms。”这里要注意没有的数据指标不要编造如果没有真实数据就描述功能实现和复杂度优化思路。7.3 后端接口开发常见考察点如果你在面试中提到写过后端接口面试官通常会追问RESTful API 设计规范。如何做参数校验。如何统一异常处理。如何解决跨域问题。接口如何保证幂等性。跨域问题是前后端分离项目的高频题。简单来说浏览器同源策略会限制不同源之间的请求后端可以通过 CORS 配置解决。Spring Boot 配置跨域示例import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; Configuration public class CorsConfig implements WebMvcConfigurer { Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping(/**) .allowedOrigins(http://localhost:5173) .allowedMethods(GET, POST, PUT, DELETE, OPTIONS) .allowedHeaders(*) .allowCredentials(true) .maxAge(3600); } }注意allowedOrigins不要直接写*如果allowCredentials为 true跨域配置会更严格生产环境应配置具体前端域名。7.4 项目亮点需要提前准备建议准备 2-3 个真实的技术亮点例如把接口的查询性能从 N1 优化成 Join 缓存。把定时任务改成分布式锁避免多节点重复执行。使用消息队列异步处理耗时操作削峰填谷。日志链路追踪从入口到出口串联日志。每个亮点都要能回答“原理是什么、怎么实现的、遇到了什么问题、数据效果如何”。8. 高频 100 题分类速查清单下面给出一份“高频 100 题”分类清单大纲你可以根据自己的掌握程度打勾模块高频题示例掌握程度Java 基础10题String 为什么不可变、 与 equals 区别、异常分类、泛型擦除必背Java 集合10题HashMap 原理、ArrayList 扩容、HashSet 去重必背Java 并发15题synchronized vs ReentrantLock、volatile、线程池参数、ThreadLocal、CAS必背JVM15题内存区域、GC 算法、类加载、OOM 排查、JVM 调优参数必背Spring10题IOC、AOP、Bean 生命周期、事务传播行为、循环依赖必背Spring Boot10题自动装配、starter、配置文件优先级、异常处理必背MySQL15题索引、事务隔离级别、MVCC、锁、SQL 优化、分库分表必背Redis10题数据类型、持久化、缓存穿透/击穿/雪崩、分布式锁必背计算机网络5题TCP 三次握手、HTTP/HTTPS、GET/POST 区别熟练表达算法10题冒泡排序、反转链表、爬楼梯、两数之和、层序遍历手写过关这份清单可以根据你的目标公司调整优先级。如果投的是互联网大厂算法和并发权重更高如果是传统企业自研Spring 和数据库权重更高。9. 常见问题与面试踩坑排查9.1 面试问题答不上来怎么办面试时最怕遇到完全不会的问题。正确的处理方式不是沉默而是表达思路。可以采用这个模板“这个问题我没有深入研究过但根据我目前的理解它可能与 XX 有关。我的初步想法是……”即使回答不完全正确面试官也能看到你的逻辑推导能力和学习态度。9.2 代码运行常见报错准备面试过程中如果实际动手写代码可能会遇到一些常见报错这里整理几个典型的问题现象常见原因解决思路java.lang.OutOfMemoryError: Java heap space堆内存不足对象无法回收导出堆快照分析调整 -Xmx优化代码Lombok 相关报错You arent using a compiler supported by lombokIDE 或 JDK 版本与 Lombok 不兼容更新 Lombok 版本或升级 IDE检查 JDK 版本Spring Boot 启动失败提示端口占用8080 端口已被其他进程占用使用netstat -ano查找 PID杀掉进程或改端口后端接口跨域报错浏览器同源策略限制后端配置 CORS或使用网关统一处理MySQL 慢查询索引失效或 SQL 写得不合理EXPLAIN 分析 SQL检查索引和查询条件9.3 面试复盘方法每次面试结束后花 30 分钟复盘记录被问到但没答好的问题。找出追问回答不深的原因。把没答好的题补充进笔记。下次面试前重点复习这些薄弱点。面试不是背答案而是一个不断补齐知识盲区的过程。10. 最佳实践与工程建议10.1 知识复习建议不要一次性背大量答案每天只背一个模块。用“费曼学习法”把当天知识讲给朋友或录音给自己听。对高频题写一份“关键词 分点回答”的提纲而不是完整背诵。每天至少手写 2 段代码一段算法一段并发/Spring 相关。10.2 面试表达建议回答问题时先亮结论再展开细节。例如“HashMap 是数组 链表 红黑树结构接下来我从 put 流程说起”。不会的问题不要装懂坦诚说明后会尝试推导。项目介绍保持在 2-3 分钟内重点突出难点和解决过程。遇到算法题先和面试官确认输入输出约束再动手写代码。10.3 工程安全与规范意识即使是在面试中也会考察你的工程意识。以下原则值得提前准备生产环境涉及数据变更必须先备份、再执行、最后验证。线上排查问题遵循最小权限原则不在未经授权的情况下操作。数据库更新和删除必须带 WHERE 条件避免全表误操作。日志记录要包含上下文信息例如订单号、用户 ID、请求 ID。敏感信息不要明文打印到日志里比如密码、token。这些内容不需要背平时写代码时养成习惯面试时自然能说出来。10.4 一周之后的持续学习方向一周冲刺只能帮你“快速过一遍”如果想在 Java 后端这条路上走得更远后续可以按这个方向深入源码阅读HashMap 源码、Spring IOC 源码、Spring Boot 自动装配源码。分布式学习 RPC 原理、分布式事务、分布式锁、CAP 理论。微服务Spring Cloud Alibaba、Nacos、Sentinel、Gateway。性能调优JVM 调优、MySQL 慢 SQL 优化、Redis 性能优化。项目实战尝试从零设计一个高并发秒杀系统或短链系统。11. 考前一天怎么做最后一天不需要再学新知识重点是全量串讲和状态调整。建议你这样做把 100 道高频题按章节快速过一遍能说出关键点就过。把算法题中最容易忘的代码手写一遍不需要全部重写。把项目描述大声读一遍控制在 2 分钟内。准备好自我介绍突出你的技术方向和项目经历。早点休息面试状态比临时抱佛脚更重要。面试准备过程中焦虑是正常的但只要每天按节奏推进把高频题吃透、把项目讲清、把代码写顺一周时间完全可以给自己一个满意的结果。祝每一位正在准备 Java 后端面试的同学都能收到心仪的 offer。
返回列表