公司动态

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

📅 2026/8/30 22:11:53
爱奇艺Java校招笔试复盘:从HashMap到JVM的核心考点解析
2018年8月底我投了爱奇艺的Java工程师岗位第一轮笔试安排在晚上七点登录牛客网在线答题120分钟题量不算小。当时我正在集中刷校招笔试爱奇艺这场给我的印象挺深它不像有些大厂那样全篇堆算法题而是把Java基础问得很细同时考了四五道算法和一道场景设计题整体感觉就是“既要你基础扎实又要你有工程思维”。这篇文章就把我回忆出的题型结构和核心考点整理出来逐题讲清楚考察意图和解题思路。对于正在准备Java校招的同学来说这场笔试的题目覆盖面很典型可以作为一轮完整的自测看看自己的Java基础和算法功底到底在什么水平。1. 笔试整体回顾与考察思路拆解1.1 题型结构与时间分配先说卷面结构。爱奇艺这场笔试一共四个部分单选题、多选题、两道编程题、一道场景设计题总分100分时间是120分钟。单选大概20道多选10道每题分值不高但覆盖面很广从Java语法、集合原理、JVM到Linux命令、数据库、网络协议都有涉及。编程题每题20分左右场景设计题差不多15到20分。时间分配上我个人的策略是选择题控制在40-50分钟宁可快速判断也不要在一道题上纠结超过3分钟。留下70分钟左右给编程题和设计题其中编程题至少留50分钟因为需要时间调试边界条件。实际做下来选择题里确实有几道需要算一下的比如HashMap扩容前后的桶下标变化、线程池核心线程数的计算这些不该靠猜要快速在小本子上推演。1.2 爱奇艺这场笔试到底想筛什么样的人从我考完的复盘来看爱奇艺这场笔试的筛选逻辑很清楚第一层筛基础第二层筛代码能力第三层筛工程思维。选择题部分考得最多的就是Java集合、并发和JVM这基本就是Java工程师的“基本功三件套”。编程题没有出特别偏的算法而是考了排序和字符串处理这类高频题型说明他们不指望校招生能秒解红黑树之类的高难度算法但你必须能快速写出无bug的常规解法。场景设计题则结合爱奇艺的业务背景比如视频播放高峰期怎么设计缓存、带宽怎么控制这种题目没有标准答案考察的是你有没有把技术和业务场景结合起来的意识。所以我的判断是这场笔试非常“Java工程师向”不是纯算法岗的考法。准备时重点应该放在Java核心知识体系上而不是钻牛角尖刷竞赛题。2. Java基础考点深度解析经典面试题核心2.1 面向对象三大特性与设计原则考察选择题第一道就考了面向对象问的是“以下关于继承的描述正确的是”。选项里有一个特别容易错的父类构造器是否会被子类隐式调用。很多同学知道子类构造器会调用父类无参构造器但如果父类没有无参构造器子类就必须显式用super调用否则编译报错。这道题考点其实在构造链的执行顺序。另一道考的是“封装的好处”四个选项都看起来有道理但最核心的应该选“降低耦合、提高安全性”。这类题本身不难难的是你在快速答题时能不能把“封装”和“抽象”的边界分清。我建议复习的时候把封装、继承、多态这三大特性的定义、代码体现、实际应用场景各准备一个例子笔试选择题里出现直接套。还有一道多选问“哪些设计原则符合面向对象设计”出现了单一职责、开闭原则、里氏替换等选项。这个不是纯Java语法题了更像是在考你的工程素养。通常多选原则是多选少选都不得分所以拿不准的原则宁可少选也别选错。2.2 集合框架HashMap的底层原理是必考题选择题里关于集合的题目至少有四道其中HashMap相关就占了两道难怪大家总说“Java面试必问HashMap”。一道考的是“JDK 1.8中HashMap在什么条件下从链表转红黑树”正确答案是链表长度大于等于8且数组长度大于等于64。另外一个选项“链表长度大于等于8就转红黑树”是不完整的少了数组长度判断很坑。第二道是“HashMap扩容时元素位置的变化”。这个我当时在小本子上画了图才确定扩容后数组长度翻倍元素的新下标要么不变要么是原下标加上旧数组长度。原因是newIndex hash (newCap - 1)而newCap - 1比oldCap - 1多了一个高位1这个高位是否被hash命中就决定了位置是否偏移。这类题光背结论容易忘强烈建议自己推一遍位运算过程。多选里还考了ArrayList和LinkedList的区别。看似简单但选项里有一个说“LinkedList适合随机访问”这是明显错误的。另一个说“ArrayList删除操作比LinkedList慢”这个其实要看删除位置如果删的是末尾ArrayList反而更快。所以我在这种题上吃过亏经验是看到“一定”“总是”“所有”这种绝对化表述的选项先画个问号。2.3 异常处理与多线程并发考点异常部分考了一个很典型的题给定一段代码问输出顺序。代码大概是try块里return之前finally块里又修改了返回值。正确答案是finally执行了但返回值是在return表达式计算之后、finally执行之前确定的所以finally里修改基本类型变量不会影响返回值但如果返回的是对象引用对象内容会被改掉。这是一个高频易错点笔试和面试都爱考。多线程的题就更多了。有道题问“以下哪些方式可以创建线程”答案是继承Thread、实现Runnable、实现Callable配合FutureTask还有一个选项是“使用线程池创建”这个表述有争议严格来说线程池也是通过Runnable或Callable提交任务不算独立创建方式当时我犹豫了一下最后没选复盘认为是正确的。还有一道考synchronized和ReentrantLock的区别。选项里提到“synchronized可以响应中断”这是错的synchronized等待锁时不能被中断ReentrantLock的lockInterruptibly才可以。这类并发的知识点光看概念不够建议自己写小demo验证一下记忆会深刻很多。2.4 JVM内存模型与垃圾回收JVM相关考点集中在内存区域划分和垃圾回收算法。有一道题给了一段代码问“以下对象创建后主要存放于哪个区域”答案是堆。选项有栈、方法区、本地方法栈。这个本身不难但背后有个值得展开的东西对象的引用放在栈上实例数据放在堆上类元信息在方法区。如果之前没理解透彻可以在本子上画一张JVM内存分区图把栈、堆、方法区、程序计数器、本地方法栈各自存什么标清楚。还有一道考垃圾回收算法的题目问“哪些算法会引发Stop The World”。标记-清除和复制算法都会G1在部分阶段也会有STW只是停顿时间可控。这道题提醒了我一个复习方向不要只背“CMS和G1的区别”要把各个收集器的特点放在一起对比比如年轻代用什么算法、老年代用什么算法为什么要这样组合。另外多选题里有一道跟前面热词对应的题目“Java内存溢出错误OutOfMemoryError属于哪类异常”。正确答案是Error而不是Exception这道题其实在考异常体系和JVM错误的分类。很多人一看到带“Error”的就认为是运行时异常其实OutOfMemoryError是java.lang.Error的子类属于JVM无法继续执行资源时的严重问题。这个点如果是选择题通常能筛掉一批基础不牢的考生。3. 算法与数据结构实战解析3.1 排序算法冒泡、快排的手写与优化编程题第一道考的就是排序题目描述是“给定一个整数数组使用快速排序算法进行升序排列输出排序后的数组”。很多人觉得快排简单但笔试里写快排有个坑如果你选的是最经典的递归实现要注意递归退出条件和partition的边界处理否则很容易出现死循环或者数组越界。我当时写的快排是这样的public static void quickSort(int[] nums, int left, int right) { if (left right) return; int pivot partition(nums, left, right); quickSort(nums, left, pivot - 1); quickSort(nums, pivot 1, right); } private static int partition(int[] nums, int left, int right) { int pivotValue nums[left]; int i left, j right; while (i j) { while (i j nums[j] pivotValue) j--; nums[i] nums[j]; while (i j nums[i] pivotValue) i; nums[j] nums[i]; } nums[i] pivotValue; return i; }这段代码用的是挖坑法选最左边元素作为基准值先从右往左找小于基准值的元素填到左边坑里再从左往右找大于基准值的元素填到右边坑里。好处是交换次数少也比较好记。笔试的时候我特意加了一个判断如果数组已经有序快排会退化成O(n2)但题目没要求优化我就没有做三数取中。如果时间充裕可以对这种退化情况做一下改进面试能加分。3.2 链表与字符串操作题第二道编程题是字符串相关的题目大意是“给定一个字符串找出其中最长的不含重复字符的子串长度”。这是LeetCode原题但笔试环境没有提示完全靠自己写。我用的滑动窗口加HashSetpublic int lengthOfLongestSubstring(String s) { SetCharacter set new HashSet(); int left 0, right 0, maxLen 0; while (right s.length()) { char c s.charAt(right); if (!set.contains(c)) { set.add(c); right; maxLen Math.max(maxLen, right - left); } else { set.remove(s.charAt(left)); left; } } return maxLen; }这个思路的关键在于left和right都只能往右移动窗口内的字符用Set保存遇到重复字符就移动left指针同时删除对应的字符直到窗口内没有重复字符为止。笔试时我第一版把right移动和left收缩写在了一个循环里结果出现了死循环后来改成else分支结构才跑通。这提醒我算法题里指针移动的每一步都要能明确说出“当前状态”和“下一步目的”否则最容易在边界上出错。链表题虽然没有出现在编程题里但单选里有一道“反转链表的递归实现”问的是递归返回值。我当时选的是“返回新链表的头节点”这个考点比较经典。复习链表时建议把迭代反转和递归反转都写一遍特别是递归版本思路是“先反转后面的链表再把当前节点接到尾部”很多同学在现场写不出来是因为递归的终止条件没想清楚。3.3 动态规划与搜索题思路多选里有一道跟动态规划沾边的题问“在求解背包问题时以下哪些说法正确”选项涉及状态转移方程和空间优化。这个题目不要求现场写代码但考了“滚动数组优化可以把二维dp降到一维”这个知识点。我当时选了它因为它确实是我刷题时反复用到的优化手段。虽然这场笔试没有出较难的动态规划题但据我了解爱奇艺后续场次出现过最长上升子序列和编辑距离这类题。所以准备算法的时候不能只押简单题要按照“数组、字符串、链表、二叉树、动态规划、回溯”这个顺序每个类别至少刷30道高频题。编程题的世界里没有侥幸见过的题型越多笔试时的心态就越稳。搜索题在选择题里也有一点体现比如问“二叉树的层序遍历使用什么数据结构”答案是队列。这种送分题主要在抢时间不要想太多看到打勾就过。4. 数据库、网络与场景题4.1 数据库索引与SQL优化数据库相关选择题考了索引失效的场景题目是“在什么情况下即使查询条件中有索引列索引也不会生效”。答案选项包括对索引列使用函数、隐式类型转换、使用LIKE前缀通配符。这些都是经典判断考的是对B树索引结构的理解程度。我自己的理解方式是把索引想象成书的目录如果你问“第300页到第400页讲了什么”目录可以帮你快速定位但如果你问“所有提到‘Java’的页有哪些”目录就帮不上忙了因为这是全文检索的场景。索引失效的底层原因也是类似的一旦条件变成了“非前缀匹配”或者“对列做了函数变换”B树的排序结构就派不上用场了。还有一道SQL题给了员工表和部门表要求统计每个部门的员工数并输出部门名称和人数按人数降序排列。考察的是JOIN、GROUP BY和ORDER BY的组合使用。笔试时要注意GROUP BY的字段必须是SELECT中的非聚合字段否则MySQL 5.7以下可能不报错但换到别的数据库就会有问题。4.2 网络基础TCP、HTTP题目网络题考了TCP三次握手的状态变化这个算是计算机基础里的钉子户。题目问的是“第二次握手后服务端所处状态是什么”答案是SYN_RCVD。这里有个容易混淆的地方客户端收到第二次握手后进入ESTABLISHED但服务端要等到第三次握手完成后才进入ESTABLISHED中间这一小段时间服务端处于半连接状态。另外一道HTTP题问“HTTP无状态是什么意思”答案很简单但题目的警示作用很大后续面试经常会追问“HTTP无状态如何保持登录状态”答案是Cookie和Session机制。笔试虽然没继续考但我建议把Cookie和Session的区别、Token方案、分布式Session解决方案都整理成笔记它们是Java后端面试的高频问题。有一道题涉及TCP和UDP的区别选项里说“TCP比UDP传输速度快”这是错的。TCP因为有连接管理、确认重传、拥塞控制开销比UDP大但在可靠性要求高的场景必须用TCP。这个要是搞反了后面场景设计题也会吃亏。4.3 场景设计题爱奇艺视频缓存与播放器的思路最后一道场景设计题题目大概是“爱奇艺视频播放高峰期大量用户同时请求同一热门视频如何设计缓存方案减轻后端压力”。这题没有标准代码需要写出设计思路我当时分了几层回答。第一层是CDN缓存把热门视频的分片推送到离用户最近的CDN节点用户播放时优先从最近的节点拉取避免所有请求都打到源站。第二层是应用层缓存使用类似Redis的分布式缓存把视频的元数据、播放地址、用户观看记录等高频读取的数据缓存起来减少数据库查询。第三层是数据库层面对热点数据进行读写分离、分库分表或者引入消息队列做削峰填谷。这类题考察的不是你会不会背组件而是有没有真实环境中的判断力。比如我说到缓存击穿补充一个解决思路对于热点key可以设置不同的过期时间或者在缓存失效时用分布式锁控制回源请求的并发数。这种细节能让阅卷官看出你是有经验的不只是背了八股。5. 编程题实操记录与踩坑点5.1 编程题环境与输入输出陷阱在线编程题和本地IDE做题完全是两个体验。我当时用Java写第一道排序题本来以为很快就能过结果卡在了输入解析上。牛客网常见的输入形式是第一行是数组长度n第二行是n个整数空格分隔。如果直接用Scanner逐行读要注意nextInt和nextLine混用时会吞掉换行符。我当时用的标准写法是Scanner sc new Scanner(System.in); int n sc.nextInt(); int[] arr new int[n]; for (int i 0; i n; i) { arr[i] sc.nextInt(); }这种写法不会出问题但如果你中间插了sc.nextLine()去“吃掉换行符”反而容易出错。我的经验是在线编程题中输入能不用nextLine就不用了除非明确要读取包含空格的整行字符串。另外要注意题目有没有说“如果数组为空或null直接返回”很多同学漏掉这个空数组判断导致部分用例失败。这类边界条件是笔试编程题最容易丢分的地方至少要把n0、n1这两种情况单独想一遍。5.2 边界条件与性能优化编程题常见的问题不只是答案错还有超时。比如字符串那题如果暴力用两层循环枚举所有子串时间复杂度是O(n3)当字符串长度到10万级别时必然超时而滑动窗口是O(n)一下就拉开差距。再比如排序题题目要求“用快速排序”好多同学直接调Arrays.sort()。这里要注意Arrays.sort()对于基本类型数组用的是双轴快排但对于对象数组使用的是归并排序虽然结果对但可能被认为没有按题目意图完成。所以笔试时建议手写快排花不了多少时间但能体现你真的理解这个算法。5.3 常见的Java编译与运行错误这部分结合我在笔试中实际犯过的错误说几个特别注意的地方数组越界是最高频报错快排里partition方法很容易因为左指针和右指针交叉而越界写完后先用极端case数组已有序、数组全相等自测一遍。死循环也很常见比如滑动窗口里left和right没有正确推进或者while条件写成了i j但语义应该是不允许相等。字符串比较使用而不是equals这在Java笔试中如果涉及String比较一定会得到意想不到的结果因为比较的是对象引用equals才比较内容。变量命名不清导致自己改错地方建议用left/right、slow/fast这类语义清晰的命名能减少调试成本。我在检查代码的时候习惯把“数组长度为0”“只有一个元素”“所有元素相同”“最大值在首位”这四类case跑一遍基本能把代码里的常见逻辑漏洞都暴露出来。这个习惯延续至今工作中提代码评审也会先想边界。6. 常见问题速查与避坑经验6.1 笔试期间容易踩的坑汇总这里整理一下爱奇艺这场笔试里我踩过和见过的坑做成一个速查表留着以后复习用坑点具体表现正确姿势输入解析使用nextLine()残留换行符能用nextInt就用nextInt或提前处理换行HashMap转红黑树条件误以为只跟链表长度有关链表长度≥8且数组长度≥64try-catch-finally返回值以为finally能改返回值基本类型返回值在return表达式时已确定synchronized响应中断以为等待锁能被打断synchronized不可中断ReentrantLock可中断快排partition边界忘记ij条件导致越界写完后立刻用边界case自测GROUP BY与SELECT字段字段不对导致报错或结果错误确保非聚合字段都在GROUP BY中6.2 后续准备建议与实用技巧笔试只是校招的一道关过了笔试还有两轮技术面与其临时抱佛脚不如在投简历前就系统地把Java知识过一遍。我建议按“基础语法-集合源码-JVM-并发-框架-项目”的顺序复习每个阶段配合刷题和手写代码。具体来说基础语法以选择题为主重点看字符串、异常、泛型、枚举。集合源码要能做到说出HashMap的put流程、扩容时机、JDK 1.8和1.7的差异。JVM部分画一张内存图把堆、栈、方法区的存储内容标清楚再理解垃圾回收的常见算法和收集器。并发部分建议找几个面试题高频例子比如手写单例、手写生产者消费者模型。算法部分平时一定要保持手感一天两到三道题比周末集中刷二十道要有效得多。我在准备校招的三个月里一直用一个表格记录每天刷的题、题号和核心思路最后一周直接翻表格复习比从头刷一遍高效太多。最后说一个容易被忽视的点笔试前一定要确认自己的JDK版本和编译环境。有同学本地用的Java 8线上笔试环境却是Java 17语法上如果不小心用了较高版本的API编译阶段就会报错非常影响心态。尽量提前用在线笔试环境做一次模拟题熟悉代码编辑器的自动补全和报错提示这些小细节真的会影响发挥。6.3 个人复盘这场笔试之后的思考考完爱奇艺这场笔试后我做了一次系统性复盘把所有错题和蒙对的题都重新过了一遍每一道题都写出正确答案和相关的知识点扩展。比如HashMap那道题我在笔记里不仅记录了链表转红黑树的条件还把扩容后元素位置的计算过程写了一遍这样即使面试官换一种问法我也能应对。这个过程给我的感受是笔试通过率高不高不在于你刷了多少套题而在于你有没有把每一道做过的题真正吃透。一次认真复盘比盲目刷三套题都管用它能帮你找到知识体系里的盲区然后针对性补齐。后来的面试中有好几个问题其实都是从笔试题目延伸出来的比如“HashMap在并发场景下会有什么问题”“如何避免缓存击穿”如果笔试后没有深入整理我在面试现场很可能答得不够全面。这也是我把这场笔试经历详细记录下来的原因希望能给正在准备校招的同学一些可复用的方法。