尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

爱奇艺Java校招笔试复盘:从HashMap到JVM排查的考点全解析

爱奇艺Java校招笔试复盘:从HashMap到JVM排查的考点全解析 秋招季的笔试总是来得又急又密。爱奇艺这场 Java 工程师第二场考完出了考场基本就能听见三种声音一种是讨论 HashMap 在多线程下的扩容问题一种是抱怨 Lombok 在高版本 JDK 下突然编译不过还有一种是在问“源发行版 17 需要目标发行版 17”到底该怎么改。这三个话题看上去互不相干但实际上暴露的是同一件事很多同学基础题背得滚瓜烂熟遇到真实工程环境里的报错和边界情况还是容易卡壳。这篇复盘不是把网上流传的真题抄一遍而是结合这类互联网视频平台 Java 后端校招的笔试习惯把 Java 基础、集合源码、JVM、排序算法、开发环境、工程框架这几个重点方向串一遍。内容不是给你一份“考前押题”而是告诉你哪些地方是真正拉开分差的哪些报错其实有固定的排查套路。适合正在准备 Java 校招、想系统性查漏补缺的同学也适合那些刷了不少题但一碰环境问题就头疼的人。1. 从热搜关键词反推这场笔试到底在考什么在刷“爱奇艺 java 校招真题”相关资料的时候我发现比“原题”更有意思的是那些被反复搜索的关联词。搜索行为本身就是考生实际踩坑的投票结果。比如java: outofmemoryerror: insufficient memory、java: you arent using a compiler supported by lombok、冒泡排序java、java环境变量配置、java枚举类型的使用、lambda函数 java这些词表面上是零散问题背后其实都对应着明确的考点分布。我整理了一张映射表把这些高频搜索行为对应到笔试和面试中最可能出现的考查形式热搜词底层考点笔试/面试常见考法outofmemoryerror: insufficient memoryJVM 内存模型、内存溢出排查给一段代码判断哪些区域可能 OOM或描述排查链路Lombok 编译器不支持报错编译环境、注解处理器现场解决编译报错或问注解处理机制源发行版 17 需要目标发行版 17Java 版本、编译参数环境配置类问题经常在机考现场出现冒泡排序、快速排序实现经典排序、边界控制手写代码要求写对、写稳、聊优化HashMap、equals/hashCode集合源码、哈希原理源码级提问几乎必考枚举类型、lambdaJava 语言特性代码阅读题、改写题标识符命名、运算符表达式语法基础选择题属于送分题但暗藏陷阱数组越界异常边界条件算法题中的低级失分点Spring Boot API Key 安全对接框架实战、接口安全项目设计题或业务场景题人人 Java 框架与 BladeX 对比开源框架选型综合设计题考察工程判断力从这张表能看出这类大型互联网公司的 Java 笔试并不只是“背八股文”。它更看重你能否在有限时间内把基础语法写正确、把算法边界处理干净、把环境问题快速定位。爱奇艺的业务场景里有大量视频内容管理、用户播放行为、弹幕消息、推荐排序等数据密集场景所以排序、集合、并发这些知识点几乎一定会被拿出来考。很多人备考时容易犯一个错误只刷算法题不碰环境也不看框架。结果十月秋招笔试全程顺利到了面试官问“你项目里接口怎么做安全鉴权”的时候瞬间冷场。后面几章我就按照这个“基础语法 → 排序算法 → JVM 排查 → 环境工具链 → 工程框架”的顺序把每一个容易出分的点展开讲。2. 语法细节与集合源码最容易拉开分差的区域2.1 标识符命名、运算符与表达式送分题里藏暗坑先说一个大家觉得最简单、但笔试选择题里经常有人丢分的点标识符命名规则。Java 标识符只能用字母、下划线、美元符以及 Unicode 字符数字不能开头不能和关键字重名。很多人记得“不能数字开头”却容易忽略$和中文其实也是合法字符。我给你写几个例子// 合法 int age 20; int _count 10; int $money 500; // 语法上合法但工程上强烈不推荐 int 视频数量 3; // Java 支持 Unicode 标识符但团队规范一般禁止 // 非法 // int 1stNum 5; // 数字开头 // int class 1; // class 是关键字 // int my-name 1; // 中划线不是合法字符笔试里如果出现这种题不要犹豫逐个字符看尤其注意$和中文。这种考点本身不难但确实见过有人因为“太自信”选错。运算符和表达式这块最常考的是三目运算符的自动拆箱空指针问题。比如Integer a null; int b a ! null ? a : 0;这段代码看起来没问题但真实场景里a是Integer三目运算符的返回值类型会做自动拆箱如果某个分支返回int另一个分支返回Integer编译器会尝试统一类型导致null被拆箱从而抛出NullPointerException。这类问题在选择题里经常作为“一眼看过去没问题但其实会崩”的陷阱出现。2.2 枚举与 lambda从“会用”到“会设计”校招笔试里枚举的考查通常不复杂但很能看出你有没有真正理解它的设计意图。2018 年前后正好是 Java 8 普及、流式编程逐渐成为主流的时间节点所以 lambda 和枚举经常搭配考。先讲枚举。一个视频内容平台最典型的状态就是视频审核状态待审核、已上线、已下线。用枚举管理这类固定状态比用int常量安全得多public enum VideoStatus { PENDING(0, 待审核), ONLINE(1, 已上线), OFFLINE(2, 已下线); private final int code; private final String desc; VideoStatus(int code, String desc) { this.code code; this.desc desc; } public int getCode() { return code; } public String getDesc() { return desc; } public static VideoStatus of(int code) { for (VideoStatus status : values()) { if (status.code code) { return status; } } throw new IllegalArgumentException(未知状态: code); } }如果题目让你把“根据状态数字返回对应状态”写出来用switch当然可以但上面这种of工厂方法更符合工程习惯。笔试里如果要求设计一个状态机模型用枚举加一个next()方法也能优雅实现这就是把“会用”变成“会设计”的差别。lambda 的考题一般都围绕Stream操作。比如给一个视频列表要求筛选出播放量大于一万的视频按播放量倒序排列取前十条。用 Java 8 写就是一行流水线ListVideo hotVideos videos.stream() .filter(v - v.getPlayCount() 10000) .sorted(Comparator.comparingLong(Video::getPlayCount).reversed()) .limit(10) .collect(Collectors.toList());这类题首先考察你是否熟悉stream()基础操作其次考察Comparator.comparingLong().reversed()的写法。很多人在reversed()这里翻车因为如果比较器本身是通过方法引用构造出来的类型推断可能出问题所以笔试手写时尽量把Comparator单独拆出来写可读性和正确性都更高。2.3 HashMap 源码几乎每场必考不管是 2018 年还是现在HashMap都是 Java 笔试里的“钉子户”。原因很简单它能串起哈希、数据结构、并发安全、工程优化一堆知识点。核心要掌握这几点第一数据结构是数组加链表链表长度超过阈值默认 8并且数组长度大于等于 64 时转成红黑树。为什么是 8因为泊松分布下哈希冲突导致链表长度达到 8 的概率已经非常低转树能降低极端情况下的查询耗时。第二put流程计算 key 的 hashCode再做高位扰动JDK8 是(h key.hashCode()) ^ (h 16)然后(n - 1) hash定位到数组下标。如果当前位置为空直接放不为空判断 key 是否存在存在则覆盖否则尾插法插入链表或树。第三扩容机制默认初始容量 16负载因子 0.75当size 16 * 0.75时扩容为原来的两倍。resize时会重新计算元素位置JDK8 的优化是利用hash oldCap判断元素留在原位置还是移动到“原位置加旧容量”的位置。笔试常考的问题是HashMap为什么线程不安全答案要点是并发put可能导致数据覆盖扩容时 JDK7 的头插法在多线程下可能形成环形链表导致get死循环JDK8 虽然改成了尾插法但 size 和 modCount 的竞态问题仍然存在。与HashMap配套考的还有equals和hashCode。最常见的问法是重写equals不重写hashCode会怎样比如你定义了一个Video类只按videoId判断相等但没重写hashCode那么两个videoId相同的对象会得到不同的哈希值放入HashMap时会被分配到不同桶里get时永远找不到。这个案例在视频去重、弹幕按用户分组等场景里特别容易被拿来出场景题。3. 手写排序冒泡、快排和“把指定元素排到第一位”3.1 冒泡排序最能看出基本功的“简单题”笔试现场手写排序很多人不屑于写冒泡觉得太简单。但实际情况是越简单的题越容易暴露问题。冒泡排序的标准写法要有“内层比较完一轮发现没有交换就提前结束”的优化这才是完整的版本。public static void bubbleSort(int[] arr) { if (arr null || arr.length 2) { return; } for (int i 0; i arr.length - 1; i) { boolean swapped false; for (int j 0; j arr.length - 1 - i; j) { if (arr[j] arr[j 1]) { int tmp arr[j]; arr[j] arr[j 1]; arr[j 1] tmp; swapped true; } } if (!swapped) { break; } } }这段代码有两个容易忽略的地方。第一外层循环只需要arr.length - 1次因为最后剩一个元素时已经有序。第二每次内层循环的范围是arr.length - 1 - i这是基于“每轮结束末尾元素已经就位”的推导。加了swapped标记后对于一个已经有序的数组时间复杂度可以降到 O(n)这是面试官很爱追问的优化点。3.2 快速排序从教科书写法到工程版本快排在笔试里的出现频率比冒泡高得多因为既考递归思维又考边界控制。很多同学背的是“教科书版”挖坑法这里给你一个比较稳的模板public static void quickSort(int[] arr, int left, int right) { if (left right) { return; } int pivot arr[left]; int i left; int j right; while (i j) { while (i j arr[j] pivot) { j--; } if (i j) { arr[i] arr[j]; i; } while (i j arr[i] pivot) { i; } if (i j) { arr[j] arr[i]; j--; } } arr[i] pivot; quickSort(arr, left, i - 1); quickSort(arr, i 1, right); }写快排最常见的死循环和越界原因就是内层两个while里没有写i j这个前置条件导致i和j互相越过。例如从右往左找小于 pivot 的元素时如果一直找不到j会一路减到left之外这时候再赋值必然越界。所以每次内层循环都要带上i j的保护。面试官如果在手写之后追问“快排什么时候会退化”你要能答出来当数组已经有序且每次选的基准都是第一个元素时每次只能分出一个元素递归深度变成 n时间复杂度退化成 O(n²)。工程上解决这个问题常见的办法是随机选基准、三数取中或者在小数组时改用插入排序。你不一定都要手写出来但至少要知道这些优化点。3.3 Comparator 的应用把指定元素排到第一位排序题里还有一种高频场景不是让你写排序算法而是让你用Comparator实现特定的排序规则。热搜词里java comparator.comparing 将某元素值放第一个说的就是这种需求。举个例子视频列表需要把“付费会员专享”的视频排在最前面其余视频按播放量倒序排列。用Comparator.comparingInt配合thenComparing可以这样写list.sort(Comparator .comparingInt((Video v) - v.isVipOnly() ? 0 : 1) .thenComparing(Comparator.comparingLong(Video::getPlayCount).reversed()));这里最关键的是把布尔值或枚举状态映射成一个整数用于按指定顺序排列。优先级相同的元素再交给thenComparing处理第二排序字段。如果直接对Video::getPlayCount调用reversed()容易遇到类型推断问题所以我建议把内层比较器用Comparator.comparingLong(...)包一层再调用reversed()笔试手写时更稳。4. JVM 内存与 OOM八股文之外的真实排查链路4.1 内存分区与 OOM 类型java.lang.OutOfMemoryError是笔试里最常见的 JVM 考点。首先要能说清楚 JVM 内存分为哪几块程序计数器、虚拟机栈、本地方法栈、堆、方法区JDK8 之后是元空间。其中堆存放对象实例虚拟机栈存放栈帧和局部变量方法区/元空间存放类信息和常量。OOM 的类型不同原因也不同OOM 类型可能原因常见场景Java heap space堆内存不足对象过多或大对象堆积缓存未清理、批量数据加载insufficient memory原生内存不足不止堆的问题线程过多、直接内存过度分配Metaspace元空间不足加载的类太多动态生成类、热部署频繁Direct buffer memory堆外内存不足NIO 使用不当unable to create new native thread操作系统线程数达到上限无限创建线程热搜词里那个insufficient memory严格来说并不是一个标准的 JVM OOM 文案它可能是系统层面的原生内存不足或容器内存限制导致的。如果笔试选择题里出现你要意识到它指向的不只是堆内存还可能和线程栈、直接内存、容器 cgroup 限制有关。4.2 一次用户行为上报服务的 OOM 排查复盘我举一个实际排查过的例子帮助你把八股文变成操作链路。当时是一个用户行为上报服务每天晚上八点开始大量报java.lang.OutOfMemoryError: Java heap space紧接着接口大面积超时。排查步骤是这样的先用jps -l找到进程 PID。用jmap -heap PID查看堆信息发现老年代几乎占满。用jstat -gcutil PID 1000持续观察 GC 情况发现 GC 频率越来越高每次 Full GC 之后老年代占用率还是超过 95%。用jmap -dump:formatb,fileheap.hprof PID导出堆转储文件。用 MAT 打开 dump在 Leak Suspects 里看到某个ConcurrentHashMap实例占用了超过 70% 的堆内存。最后定位到问题代码里用了一个静态Map缓存用户的设备信息只写入从不清理而且 key 是每次请求的userId 时间戳导致数据无限增长。修复方案也很简单换成 Caffeine 本地缓存设置最大条数和五分钟过期策略。校招面试时你不需要真的做过 MAT 分析但如果你能说出jps、jmap、jstat、jstack这几个命令分别干什么并且知道“先看 GC 频率再看堆占用再导 dump 分析”的顺序面试官就会觉得你具备基本的线上问题排查意识。4.3 数组越界算法题里最冤的失分点笔试算法题跑不过用例相当一部分原因是数组越界。ArrayIndexOutOfBoundsException最常见的几个来源二分查找里left right的边界写错。遍历时用了i 1访问下一个元素但没有判断i是否到了数组末尾。处理空数组或长度为 1 的数组时直接访问了arr[1]。快排 partition 时没有处理left right的递归出口。一个实用的习惯是写完算法以后先在心里过一遍空数组、单元素数组、全相同元素数组这三个用例。能把这三种情况跑通大部分越界问题都能提前发现。5. 环境与工具链那些让考生当场崩溃的报错5.1 Lombok 报错“you arent using a compiler supported by lombok”很多同学在机考或者本地跑项目时遇到过这个报错。出现这个提示核心原因就是 Lombok 版本和当前使用的 JDK 版本不兼容或者 IDE 内置编译器没有正常加载 Lombok 的注解处理器。2018 年那会儿这个问题尤其典型因为当时很多人从 JDK8 升到 JDK9/10/11Lombok 旧版本还没适配。解决办法按优先级排序升级 Lombok 版本尽量使用最新稳定版。确认 IDE 里 Annotation Processing 已经开启。IDEA 在 Settings Build, Execution, Deployment Compiler Annotation Processors 里勾选 Enable annotation processing。Maven 项目里检查pom.xml中 Lombok 的依赖是不是被排除了或者版本冲突。重新 clean 之后执行mvn compile确认编译器输出没有警告。笔试现场碰到这种问题不要慌绝大部分情况下就是版本匹配问题升级依赖是最快的解决方案。5.2 “源发行版 17 需要目标发行版 17”这个报错在热搜词里反复出现它本质上是一个 Java 编译级别不一致的问题。提示的意思是源代码的编译级别是 17但当前编译器目标级别也是 17而你的环境或 IDE 配置可能没有正确对应上。排查路径是这样的如果你用 IDEA检查 Project Structure 里的 SDK 是否为 JDK17Project language level 是否设置为 17。如果你用 Maven检查pom.xml中maven-compiler-plugin的source和target以及properties里的java.version。如果你用命令行执行javac -version确认当前 javac 版本再用javac -source 17 -target 17手动指定编译参数。Gradle 项目则需要在build.gradle里配置 Java toolchainjava { toolchain { languageVersion JavaLanguageVersion.of(17) } }这个问题在校园招聘笔试的机考环境里很常见因为考场的多项目模板可能默认配置了高版本 JDK但你的 Java 代码里使用了旧版本的 API 或依赖就会报类似错误。5.3 vscode 运行 Java 报错乱码很多从 IDEA 切到 VSCode 写 Java 的同学遇到的第一个问题就是中文乱码。原因一般是源文件编码、编译编码、终端编码三者不一致。比如源文件是 UTF-8 保存的但 Windows 编译时默认使用了 GBK 编码控制台输出中文就变成乱码。解决办法统一项目编码为 UTF-8在settings.json里设置files.encoding: utf8。VSCode 的 Java 扩展运行配置里设置java.debug.settings.consoleEncoding和java.debug.settings.vmArgs。如果用的是 Mavenpom.xml里设置project.build.sourceEncodingUTF-8/project.build.sourceEncoding。机考时如果遇到乱码先不要急着改代码先把控制台编码切到 UTF-8或者用chcp 65001把终端代码页切到 UTF-8通常就能解决。5.4 环境变量配置基础但必须会JAVA_HOME、PATH、CLASSPATH这三个环境变量是 Java 开发环境配置的核心也是校招笔试机考现场经常遇到的问题。JAVA_HOME指向 JDK 的安装目录。很多工具比如 Maven、Tomcat、Gradle会依赖这个变量来定位 JDK。PATH让系统能在任意目录下直接执行java、javac等命令。配置方式是在PATH里追加%JAVA_HOME%\binWindows或$JAVA_HOME/binLinux/macOS。CLASSPATH告诉 JVM 去哪里找类文件。JDK5 以后很多场景已经不需要手动配置CLASSPATH但老项目可能还需要。一般配置为.表示当前目录即可。配置完以后打开新终端窗口依次执行java -version javac -version echo $JAVA_HOME如果都能正常输出说明环境变量配置成功。注意修改环境变量后必须新开一个终端窗口因为旧窗口不会重新加载系统环境变量。这个问题看似简单但在笔试机考现场真的会有人因为没开新窗口而误以为配置失败。6. 框架与工程化场景从 Spring Boot 到开源框架选择6.1 Spring Boot 接口如何做 API Key 安全对接这类题目在校招笔试里经常以场景题出现假设爱奇艺要开放一个数据接口给第三方合作方要求请求头携带 API Key服务端校验成功才返回数据你会怎么做一个标准的实现方式是 Spring Boot 里的HandlerInterceptor。拦截器里读取请求头的X-API-Key然后和数据库或缓存里预先生成的 Key 做比对。如果匹配失败直接返回 401。Component public class ApiKeyInterceptor implements HandlerInterceptor { private static final String API_KEY_HEADER X-API-Key; Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String apiKey request.getHeader(API_KEY_HEADER); if (!预先生成的key值.equals(apiKey)) { response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); response.setContentType(application/json;charsetUTF-8); response.getWriter().write({\code\:401,\msg\:\invalid api key\}); return false; } return true; } }然后把这个拦截器注册进WebMvcConfigurer指定拦截路径Configuration public class WebConfig implements WebMvcConfigurer { Autowired private ApiKeyInterceptor apiKeyInterceptor; Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(apiKeyInterceptor) .addPathPatterns(/openapi/**) .excludePathPatterns(/openapi/public/**); } }这样的回答已经能拿基础分。如果你想展示工程思维可以补充真实生产环境里API Key 一般不会明文存放在请求头里而是配合sign签名、时间戳、随机数防重放。例如用secret对请求参数做 HMAC 签名服务端用相同算法生成签名并比对同时校验时间戳是否在五分钟内防止被抓包后直接重放请求。6.2 人人 Java 框架与 BladeX 的选型思路热搜词里有个很有意思的对比人人java框架和bladex对比。这种问题在校招笔试中不太会直接让你写代码但技术面试时可能会问你们项目用的什么框架为什么选它这时候你需要有“选型思维”。简单说两者是不同定位的东西。人人 Java 框架RuoYi 及其系列更偏向单体快速开发脚手架技术栈通常是 Spring Boot MyBatis Vue内置了用户、角色、菜单、字典等通用后台功能适合快速搭建中后台管理系统。BladeX 则是一个企业级微服务开发平台基于 Spring Cloud内置了注册中心、配置中心、网关、链路追踪等微服务组件适合业务规模更大、需要服务拆分的场景。用一张表看更清楚对比维度人人 Java 框架BladeX定位单体后台快速开发脚手架微服务开发平台技术栈Spring Boot MyBatis VueSpring Cloud Alibaba 全家桶适合团队中小团队、业务逻辑集中大中型团队、多团队协作学习成本低上手快高需要理解微服务体系扩展性中等可改造为微服务强原生微服务架构面试时如果被问到怎么选型不要只说“A好用”或者“B更先进”。你要从业务复杂度、团队规模、运维成本和未来演进路径几个角度分析。比如一个只需要内部使用的管理后台硬上微服务就是自找麻烦而一个需要支撑高并发、多业务线独立发布的平台单体架构后期会非常痛苦。这种判断力才是面试官真正想看的。6.3 接口自动化测试框架校招里容易被忽略的加分项很多人觉得测试自动化和开发岗位没关系其实不然。很多公司校招笔试里会问“你怎么保证你写的接口质量”而一个完整的接口自动化测试框架思路是很好的加分答案。基本的分层设计可以这样组织用例层用 TestNG 或 JUnit5 编写测试用例一个用例就是一个场景。接口封装层把每个 HTTP 接口封装成方法参数化输入。数据驱动层把测试数据放在 YAML 或 Excel 里用 DataProvider 读取。报告层用 Allure 生成测试报告。用 RestAssured 写一个简单接口测试示例import static io.restassured.RestAssured.given; import static org.hamcrest.Matchers.equalTo; public class LoginApiTest { org.testng.annotations.Test public void testLoginSuccess() { given() .baseUri(http://your-service.com) .header(Content-Type, application/json) .body({\username\:\admin\,\password\:\123456\}) .when() .post(/api/login) .then() .statusCode(200) .body(code, equalTo(0)); } }为什么校招会考这个因为面试官想知道你有没有完整的质量意识。能写代码的人很多但能在写代码之外想到自动化回归、数据驱动、测试报告的人往往在团队里更容易承担核心交付任务。6.4 Java 在 AI 工程化里的身影热搜词里混进了几个看起来很“非校招”的词qwen embedding、并存储milvus 调用示例 java langchain4j。这些东西虽然不会作为校招笔试的硬性考查点但它们代表了一个趋势Java 在后端工程化领域的基础地位正在延伸到 AI 应用层。具体来说langchain4j是 Java 生态里用来对接大模型能力的框架它提供LLM、EmbeddingModel、ChatMemory等抽象。一个典型的 RAG 场景实现路径是先构建EmbeddingModel把文档切块并做向量化然后存入 Milvus 这类向量数据库最后在查询时把用户问题向量化在 Milvus 里做相似度检索把命中的文本片段交给大模型生成回答。如果你在系统学习 Java 的同事关注过这些方向面试时主动提一句“Java 技术栈也能做 AI 应用层开发”会显得你视野开阔而不是只会背八股文。7. 八股文怎么背才有效一个面试官的视角校招备考绕不开“八股文”但很多人对这三个字有误解。八股文本身不是问题死记硬背才是。真正有效的备考方式是把知识点串成一张网而不是记一个个孤立的问答。我以自己的体会举例。准备HashMap时不要把“默认容量 16、负载因子 0.75、链表转红黑树阈值 8”当成三行要背的数字而要问一串“为什么”为什么默认容量是 2 的幂次方因为hash (n-1)等价于取模但位运算更快。为什么负载因子是 0.75因为这是时间复杂度和空间复杂度的折中过高会导致哈希冲突严重过低会浪费空间。为什么链表转红黑树的阈值是 8因为根据泊松分布冲突达到 8 的概率极低转树是为了防止极端情况下的退化。为什么 HashMap 线程不安全因为它没有锁保护多个线程并发 put 或 resize 时会产生竞态条件。这样把一个点延伸成四个点每个点又能继续延伸。比如“为什么hash (n-1)需要数组长度是 2 的幂次方”就连接到了位运算与哈希分布的知识“resize 时为什么 JDK8 不需要重新计算 hash”又连接到了 JDK7 与 JDK8 的对比。从备考路线来说我建议按这个顺序系统过一遍Java 基础语法标识符、运算符、流程控制、数组。面向对象与常用类封装继承多态、String、枚举、包装类。集合框架ArrayList、LinkedList、HashMap、ConcurrentHashMap。JVM内存分区、类加载、GC 算法、OOM 排查。并发编程synchronized、volatile、lock、线程池。Spring 与 Spring BootIOC、AOP、自动配置、拦截器。MySQL 与 Redis索引、事务、缓存击穿穿透雪崩。分布式基础消息队列、分布式锁、注册中心。算法与数据结构排序、链表、二叉树、动态规划。每个阶段都要配合手写代码。算法题用笔在纸上写原理题用自己的话讲一遍。你会发现当你能把一个知识点讲给完全不懂的人听明白时你才是真的掌握了。最后再分享一个我自己的习惯。备考时我准备了一个“错题本”但不是题目答案的摘抄而是每道错题旁边写三行错在哪、为什么错、下次怎么避免。笔试前翻一遍这个本子比再刷一百道新题有用得多。校招拼的其实是稳定输出那些反复出现的低级错误如果能提前排除你离 offer 就已经很近了。
返回列表