拓冰建站拓冰建站
首页 / 资讯中心 / 正文

爱奇艺Java校招笔试题复盘:核心考点与备考策略

前阵子整理移动硬盘翻出了当年投爱奇艺时保存的笔试邮件记录题目是爱奇艺2020校招Java方向笔试题第一场。说实话距离那次笔试已经过去挺久但里面涉及的考点和做题时的感受我到现在还记得很清楚。那场笔试给我的整体印象是基础题占比高、考察面广、节奏偏快想要拿高分光靠背八股文是不够的必须有真正的代码功底和底层理解。我很早就想把这场的复盘写下来。Java方向的技术面试尤其是校招笔试其实有很强的规律性考点翻来覆去就那么几块但每年都能筛掉一大批人。如果你正在准备Java校招或者刚入行想检验一下自己的基础这篇内容应该能帮你少走很多弯路。我不会把官方题目原封不动贴出来而是从考点分布、题目背后的考察意图、做题时的取舍策略这几个角度尽量还原那一场的真实体验。1. 先看考点分布这场笔试想筛什么样的人1.1 从题型构成反推考察重心爱奇艺的Java校招笔试第一场通常是线上笔试题型大致是单选、多选、填空加上两道在线编程题总时长大概90分钟。这个结构在互联网公司里很常见但它的信息量其实很大选择题考察知识广度编程题考察代码落地能力两者缺一不可。我复盘之后发现考点分布大致是这样的Java基础语法和API大概占25%集合框架和泛型大概占15%并发与多线程大概占15%JVM内存与类加载大概占12%数据库和网络基础大概占18%算法与数据结构编程题大概占15%这个分布能看出一个明确的信号爱奇艺的Java工程师岗位不需要你掌握什么特别偏门的技术但要求你把地基打得很牢。它不像有些公司喜欢考大量中间件原理也不会问太多框架源码级别的东西笔试阶段更看重的是你作为Java开发者的基本素养。我自己当时犯了一个错误就是花了很多精力去准备Spring Boot自动装配原理、MyBatis插件机制这类偏高级的内容结果卷子上没怎么出现。回头想想笔试作为第一道筛选关卡它的目标是快速淘汰基础不扎实的候选人而不是找出框架源码专家。这个定位决定了它的题目风格。1.2 Java基础的占比比你想象的要高爱奇艺2020校招Java方向笔试题里有一个很典型的现象就是Java语法级别的细节点考得非常多。比如运算符优先级、String和StringBuilder的区别、equals和的比较、数组的初始化方式、异常的分类这些听起来很基础但真到了选择题里结合具体代码场景之后错误率会非常高。我记得有一类题是给出一个代码片段问输出结果是什么涉及多个知识点叠加。这种题在准备的时候特别容易忽略因为单独拿出来你都会但是组合在一起就很容易踩坑。举个很经典的综合例子public class Test { public static void main(String[] args) { String s1 java; String s2 new String(java); String s3 s2.intern(); System.out.println(s1 s2); System.out.println(s1 s3); System.out.println(s1.equals(s2)); } }输出结果是false、true、true。这就是典型的String 常量池 引用比较组合考法单拎一个概念出来绝大多数人都知道但考场上一紧张第一空就容易写错。这类题的核心考点其实是对Java字符串驻留机制的理解而不是表面上的代码输出。所以我在复盘时给自己定了一个规矩准备笔试阶段先把《Java核心技术》或者类似的基础书过一遍不要一上来就刷面试八股文。面试八股文适合面经阶段突击但笔试考察的是你在没有提示的情况下能不能准确判断这个能力只能靠体系化复习。2. 选择题里的经典陷阱集合、String和异常的坑2.1 集合类的线程安全题为什么每次都考集合框架在Java笔试里的出场率几乎是100%而集合相关的题目最常考的就是线程安全性。ArrayList和Vector、HashMap和Hashtable、StringBuilder和StringBuffer这几组对比可以说是固定考点。我印象很深的是有一道关于HashMap多线程扩容的问题问JDK 7和JDK 8在resize上有什么区别为什么JDK 8要改成尾插法。这个题目如果只背HashMap线程不安全这个结论肯定是答不上的。这里值得多说两句因为这是笔试选择题里很典型的看着简单实则考察原理的题目。JDK 7的HashMap在多线程put触发扩容时因为采用头插法并发环境下可能形成环形链表导致下一次get出现死循环。JDK 8改为尾插法虽然避免了环形链表问题但引入了新的问题比如数据覆盖所以仍然不是线程安全的。笔试里如果问为什么JDK 8要改尾插法答案不是为了避免死循环这么简单而是要能说出头插法在扩容迁移时会反转链表顺序并发场景下两个线程同时操作就可能形成环。这类题目给我们的备考启示是集合部分不能只背结论必须把数据结构原理吃透。好在集合的底层原理并不难看完源码或者看几篇靠谱的图解文章就够了性价比很高。2.2 String与JVM内存的联动考察String类在笔试中的地位比较特殊它表面上是Java基础语法实际上常常和JVM内存模型联动考察一道题同时覆盖两个知识模块。爱奇艺那场笔试里我看到至少两三道题都和字符串有关。关于String需要掌握的关键知识点我整理了一个简单表格知识点核心要点笔试常见考法String不可变性final修饰字符串常量池复用问拼接后是否影响原字符串new String(a)创建两个对象堆常量池问对象数量intern()将字符串加入常量池并返回引用上面代码题那种拼接编译器优化为StringBuilder循环内拼接的效率问题equals与equals比较内容比较引用上面提到了这几个点组合起来可以出无数道题。我在做题的时候发现一个规律只要题目里出现了String先把常量池和堆内存这两个关键词圈出来然后按对象创建过程一步步推基本不会错。2.3 异常处理与finally块的执行顺序异常处理也是笔试选择题的高频区尤其是try-catch-finally的执行顺序以及return和finally的先后关系。这个知识点很反直觉因为很多人直觉上觉得return都执行了方法就该结束了但实际Java处理顺序是先执行完finally再return。我遇到的题目形式是public static int test() { try { return 1; } finally { System.out.println(finally); } } public static void main(String[] args) { System.out.println(test()); }输出顺序是什么答案是先打印finally再打印1。这个顺序问题我在备考初期经常判断反。后来我换了一种理解方式return语句在字节码层面其实是把返回值存入局部变量表然后执行return指令但执行return指令之前JVM会先去执行finally块。如果finally块里有修改返回变量的操作对基本类型不生效对引用类型会生效这一点更隐蔽也更容易出成区分度高的题。关于异常本身还有一个需要区分的点Error和Exception的区别受检异常和非受检异常的区别。这些属于死知识点背就完事了但我建议在背的时候各记两三个例子比如IOException是受检异常NullPointerException是非受检异常这样碰到概念辨析题时能更快锁定答案。3. 并发和JVM拉开差距的关键板块3.1 volatile和synchronized的爱恨纠葛并发是Java笔试中公认的难点也是区分度最高的考点之一。爱奇艺这场笔试里并发相关的题不算特别多但每一道都很有分量基本是围绕volatile、synchronized、JMM这几个关键词展开。volatile常考的三个特性是可见性、有序性、不保证原子性。很多人在笔试选择题里看到volatile保证原子性吗就直接选不保证这没错但如果题目进一步问为什么volatile不保证原子性就有人答不上来了。volatile不保证原子性的原因是它只对单个变量的读写操作提供可见性和有序性保障但i这种操作在字节码层面是读取-修改-写入三步volatile无法锁住这个复合操作过程。这就意味着两个线程同时读到了同一个值同时加1最后写回去时只能有一个成功。这里我给大家一个备考建议不要只看概念把这段伪代码在脑子里执行一遍比背十遍概念都管用// 假设初始 i 0两个线程同时执行 i 线程A读取 i 0 线程B读取 i 0 线程A计算 i 1 线程B计算 i 1 线程A写入 i 1 线程B写入 i 1 // 最终 i 1但实际上执行了两次自增这就是为什么volatile不能替代synchronized。笔试中如果能通过文字把这个过程讲清楚即使不是选择题而是简答题也能拿到高分。3.2 JVM内存区域划分画图比背概念更重要JVM相关的题目爱奇艺那场考得不多但很典型主要停留在内存区域划分和类加载这两个大方向上。JVM内存区域划分是Java笔试的送分题同时也是送命题。送分是因为它定义清晰背过就能答送命题是因为很多人背了定义但实际遇到哪些区域是线程共享的哪些区域会抛出OutOfMemoryError这种题时就开始混淆了。我的记忆技巧是线程共享的是堆和方法区线程私有的是虚拟机栈、本地方法栈和程序计数器。然后关于OOM堆和方法区都可能OOM虚拟机栈会OOM或StackOverflowError但程序计数器是唯一一个不会OOM的区域。这个唯一不会OOM的结论在笔试选择题里出现的频率相当高。如果笔试有简答题可能会让你描述对象在JVM中的创建过程。这个过程的完整回答应该是类加载检查、分配内存、初始化零值、设置对象头、执行init方法。我当时是把这个过程画成流程图记在笔记本上的笔试的时候就在草稿纸上先画一遍再照着写答案思路会清晰很多。3.3 类加载过程与双亲委派一道题考三个知识点类加载机制是JVM题目里的老熟人而且很容易和ClassNotFoundException、NoClassDefFoundError这种异常联合起来考。双亲委派模型常考的有两点一是JVM为什么采用双亲委派二是如果打破双亲委派会出现什么问题。双亲委派的核心思想是类加载器收到加载请求时先委托给父加载器父加载器无法完成时才自己加载。这样做的根本目的是保证类的唯一性避免同一个类被不同加载器重复加载也避免核心类被用户自定义类覆盖。我记得当时做到一道关于自定义类加载器能否加载java.lang.String的选择题答案是不能即使自定义类加载器也会先委托给Bootstrap ClassLoader。这个题其实就是在考双亲委派模型下顶层加载器的优先级。关于类加载的七个阶段——加载、验证、准备、解析、初始化、使用、卸载——我建议笔试前重点掌握前五个尤其是准备阶段和初始化阶段的区别。准备阶段是为静态变量分配内存并设置默认值初始化阶段才是执行静态代码块和赋值语句什么阶段赋默认值、什么阶段赋真实值是高频考点。4. 编程题算法思路和代码规范一个都不能少4.1 常见题型从手撕快排到LRU缓存在线编程题是校招笔试的重头戏也是很多人最头疼的部分。爱奇艺那场笔试的编程题难度属于中规中矩不涉及特别复杂的算法但很考验基本功和代码熟练度。常见的出题方向大概有这么几类排序算法的实现尤其是快排和归并链表操作比如反转链表、判断是否有环二叉树遍历包括层序遍历字符串处理比如最长回文子串LRU缓存机制、手写单例模式这类既考算法又考设计的题动态规划入门题比如跳台阶、最大子数组和我印象最深的是LRU缓存那道题。它表面上是数据结构设计题实际上是在考察你对哈希表双向链表的理解。如果直接用一个LinkedHashMap也能实现但如果你只写了这个面试官在线下问起来的时候你就很难解释清楚为什么LinkedHashMap能实现LRU以及如果不用JDK提供的类你会怎么自己实现。我自己在笔试时实现LRU的代码思路大致是这样class LRUCache { private HashMapInteger, Node map; private DoubleLinkedList cache; private int capacity; public LRUCache(int capacity) { this.capacity capacity; map new HashMap(); cache new DoubleLinkedList(); } // get时判断存在如果存在则移动到头部 // put时判断是否存在存在则更新值并移动到头部 // 如果不存在则判断是否达到容量上限达到则删除尾部节点并更新map }这个代码不复杂但写不写得出来、写得快不快非常考验平时有没有真正动手写过。这也是我建议大家复习算法时不要只看题解的原因必须自己把代码在编辑器里敲一遍模拟笔试环境手写一遍才能真正形成肌肉记忆。4.2 做题时的输入输出与边界处理编程题里有一个非常冤枉的丢分点明明算法思路是对的但因为没有处理好输入输出和边界条件导致题目无法通过。这在笔试里太常见了。Java做笔试题时输入输出要用Scanner或者BufferedReader。我个人的经验是如果是大输入量场景优先用BufferedReader因为Scanner在大数据量下的效率会拖慢程序可能在时间复杂度的测评上吃亏。不过校招笔试的在线评测一般给的时间比较宽裕用Scanner通常也没问题但你要知道两者的差别因为你不能保证哪道题的测试数据特别大。边界条件里最容易踩坑的有这几个数组为空或长度为0的情况链表为空或只有一个节点的情况整数运算时的溢出问题比如Integer.MAX_VALUE 1会变成负数字符串为空、空格、大小写混合的情况递归算法没有设置好终止条件导致栈溢出我当时的做题习惯是代码写完后再检查一遍所有的if判断看是否有空指针隐患数组下标是否可能越界。这些检查只需要两三分钟但能避免因为一次数组越界或者空指针而丢掉整道题的分数。4.3 时间复杂度的取舍先暴力再优化很多同学做编程题时有一个误区就是看到题目就想直接写出最优解结果卡在一个复杂的优化方案上浪费了半个小时最后连暴力解都没提交。正确的做法是先保证能做出来再考虑优化。笔试的时间分配非常关键。比如一道题你30秒内能想到暴力解时间复杂度是O(n^2)先别着急动手优化先快速把暴力解写出来确保有一版能跑的代码。如果时间还有富余再回头优化成O(n log n)或者O(n)。为什么我推荐这个策略因为在线笔试的评分机制通常只看测试用例通不通过。如果你的最优解没写出来得分是0但暴力解可以通过大部分基础测试用例得分可能是60分甚至80分差距很大。我见过太多同学在笔试时追求完美解法结果一上来就被一道难题卡住剩下两道简单题都没时间写。这个优先级问题真的要想清楚先拿基本分再争优化分。做题时在草稿纸上做好时间标记比如每道题最多花30分钟时间一到就切换哪怕方案不够完美也要提交。5. 数据库与网络基础绕不开的送分题和送命题5.1 索引失效场景背口诀不如理解B树数据库部分的题目爱奇艺那场笔试里出现的概率很高尤其是索引相关的内容。校招Java笔试题里数据库已经默认成为必考模块而索引则是数据库里的绝对核心。索引失效是一个高频考点网上很多口诀说左模糊失效or条件失效函数操作失效背起来很快但如果你不理解为什么失效换个场景就可能答错。索引失效的本质是数据库优化器判断走索引的成本可能比全表扫描更高或者B树结构决定了某些查询方式无法充分利用索引的有序性。比如左模糊like %abc失效是因为B树索引是按照索引列值的大小顺序排列的而%abc这种模糊匹配在遍历时需要从第一个字符开始比较无法利用B树的二分查找特性所以优化器干脆选择全表扫描。理解了这一层之后你会发现那些口诀其实都是在描述同一种情况的变体查询条件没有遵循索引列的有序性质导致索引的前缀无法被使用。这样再遇到没见过的索引失效新题型你也能根据原理推断出来而不是干瞪眼。数据库题还有一个高频考点是数据库事务的ACID四大特性以及对应的隔离级别。这个知识点建议和InnoDB的锁机制、MVCC原理放在一起复习因为它们经常被串在一起考。比如可重复读隔离级别怎么解决幻读标准答案里通常会提到MVCC和间隙锁。5.2 TCP三次握手与HTTP状态码高频但易错网络基础在Java笔试里也是常规板块。TCP协议和HTTP协议属于必须掌握的内容而且考法相对固定。TCP三次握手常考的不只是客户端发SYN、服务端回SYNACK、客户端发ACK这个流程还会深入问为什么是三次而不是两次以及两次握手会带来什么问题。这里的关键是理解握手的目的同步双方的初始序列号确保双方都具备发送和接收数据的能力。如果只有两次握手服务端无法确认客户端的接收能力是否正常也无法防止历史重复连接初始化请求导致的资源浪费。HTTP状态码这块需要重点掌握几个高频状态码200 OK请求成功301 Moved Permanently永久重定向302 Found临时重定向304 Not Modified协商缓存生效400 Bad Request请求语法错误401 Unauthorized未认证403 Forbidden禁止访问404 Not Found资源不存在500 Internal Server Error服务器内部错误502 Bad Gateway网关错误503 Service Unavailable服务不可用我在笔试和面试中都遇到过状态码辨析题而且容易混淆的是401和403。我的记忆方法是401是你没登录403是你登录了但没权限。这个区分很直观也特别实用。6. 考后复盘我的时间分配和查漏补缺6.1 我是怎么分配90分钟的笔试的时间节奏其实比很多人想象的更紧张。我当时给自己定的时间预算是选择题和基础题部分控制在45分钟左右两道编程题留45分钟。但实际操作下来选择题比预期花的时间更长因为很多题需要推导而不是一眼看出答案。特别是那种给出代码求输出的综合题一个不小心就会掉进陷阱里。我在中途意识到时间偏紧之后果断调整策略遇到超过两分钟还没思路的选择题先标记跳过把时间留给后面分值更高的编程题。这个策略事后复盘是有效的。笔试过程中最重要的是保证整体得分率而不是追求逐个击破。宁可放弃一道1分的选择题也不能让20分的编程题没时间写。还有一个小技巧在线笔试平台一般允许本地运行代码但有些环境切换比较麻烦。我当时的做法是第一道编程题写好之后先花一分钟调试基础用例确认能通过再去做第二道。这样即使第二道题只写了一部分也已经稳拿一题的分数了。6.2 笔试之后三个值得补的复习方向不管笔试结果如何考后的复盘价值其实远大于考试本身。如果你正在准备同类公司的Java笔试我建议从三个方向去查漏补缺。第一个方向是Java集合底层源码。ArrayList扩容机制、HashMap的put流程、ConcurrentHashMap的分段锁或者CASsynchronized实现这三个是高频中的高频。不只是背结论要能用人话讲清楚每个步骤。第二个方向是并发编程的实践场景。不要只背volatile和synchronized的定义试着去写一个线程安全的计数器、一个阻塞队列、一个生产者消费者模型这些编码经验在笔试和面试里都能转化成你的表达优势。第三个方向是算法题的题型归纳。排序、双指针、滑动窗口、链表、二叉树、DFS/BFS、简单的动态规划这七类题覆盖了绝大多数校招笔试的编程题。每类抽几道典型题练手比盲目刷几百道题效率高得多。我在复盘笔记的最后一页写了这样一句话笔试不是考你会不会而是考你在有限时间内能不能稳定输出。这句话后来陪伴了我整个校招季。Java基础再扎实的人如果平时缺乏限时训练上了考场也会发挥失常。所以在你投递简历之前至少拿出两周时间每天给自己安排一次完整的限时模拟笔试用真实考题或者高质量模拟题都行。练到看到题目能条件反射地判断考点笔试这关就稳了一大半。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门