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

资讯详情

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

爱奇艺2019秋招Java笔试题深度解析:核心考点与避坑指南

爱奇艺2019秋招Java笔试题深度解析:核心考点与避坑指南 每年秋招季Java方向的笔试题总能在各大技术社区里被翻来覆去讨论。爱奇艺2019秋招Java方向笔试题A这份卷子我印象很深它不像有些公司那样净出些偏难怪题整体难度分布非常“互联网大厂标准”——基础题占大头但每一道基础题背后都藏着可以深挖的考点编程题又恰好卡在“大部分人能写出来但少部分人能写漂亮”这条线上。如果你正在准备校招或者想系统梳理一遍Java核心知识这份试卷的题型和考点覆盖范围很值得拿来当一次自测。我可以直接说结论这份卷子刷透之后你不仅是在准备爱奇艺基本上面试中小型互联网公司的Java岗位笔试环节都会从容很多。下面我按考点模块拆开讲每个部分都会给出典型题目、解题思路、参考代码以及我在实际辅导和面试过程中积累的避坑经验。1. 爱奇艺2019秋招Java笔试题整体结构与考点分布1.1 题型构成与分值占比从这轮秋招的公开信息来看爱奇艺的Java笔试题型相对固定大致分为四类单选题、多选题、编程题以及偶尔出现的简答题。单选题和多选题覆盖的知识面最广从Java语法到JVM、从计算机网络到数据库都可能涉及编程题则集中在数据结构和算法偶尔会有一道偏向工程实现的题目。题型大致题量考察重点建议用时分配单选题20-30题Java基础、集合、多线程、JVM、网络25分钟多选题5-10题概念辨析、易错知识点组合10分钟编程题2-3题排序、链表、字符串、动态规划50分钟简答题0-2题并发、GC、设计模式等概念阐述10分钟这个时间分配不是随便拍的而是综合了大多数做完题的同学反馈。单选题里有很多题就是“一眼看出答案”不需要纠结多选题反而是丢分重灾区因为爱奇艺的多选题通常“漏选不得分、错选不得分”这就要求你对每个选项都有确定的判断而不是靠猜。1.2 考点覆盖范围哪些章节必须吃透结合这份试卷的覆盖范围我可以负责任地说下面这些章节是绕不开的Java基础语法基本数据类型、运算符优先级、String/StringBuilder/StringBuffer、面向对象三大特性、抽象类与接口。Java集合框架ArrayList/LinkedList底层实现、HashMap原理、HashSet去重机制、Iterator与fail-fast机制。JVM内存区域划分、类加载过程、垃圾回收算法、常见OOM场景。并发编程线程创建方式、synchronized与Lock、volatile、线程池、CAS与AQS。计算机网络TCP三次握手与四次挥手、HTTP/HTTPS、DNS解析过程。数据库索引底层结构、SQL语句执行顺序、事务隔离级别、最左前缀原则。数据结构与算法数组、链表、栈、队列、二叉树、排序算法、动态规划。这些考点并不是2019年独有直到现在依然是Java面试的核心区间。与其说你在做一份历史真题不如说你在做一份“Java岗位笔试的复习地图”。2. Java核心基础笔试中最常见的送分题和陷阱题2.1 面向对象与字符串这些概念题看似简单错的人特别多先说一个很典型的考察角度类的初始化顺序。public class Father { static { System.out.println(Father static); } { System.out.println(Father instance); } public Father() { System.out.println(Father constructor); } } public class Son extends Father { static { System.out.println(Son static); } { System.out.println(Son instance); } public Son() { System.out.println(Son constructor); } } public class Main { public static void main(String[] args) { new Son(); new Son(); } }输出顺序是什么答案是Father static Son static Father instance Father constructor Son instance Son constructor Father instance Father constructor Son instance Son constructor这里有两个知识点要记住一是静态代码块只执行一次且先父类后子类二是实例代码块和构造函数在每次new对象时都会执行且父类实例化先于子类实例化。这个点在单选题里出现频率极高我在给学生讲题时发现至少有一半人会在这里丢掉分。再看一道关于String的经典题String s1 abc; String s2 new String(abc); String s3 ab c; String s4 new String(ab) c; System.out.println(s1 s2); System.out.println(s1 s3); System.out.println(s1 s4); System.out.println(s1.equals(s2));结果是false、true、false、true。s1和s3都是编译期常量会指向字符串常量池的同一个对象s2和s4都是运行时创建的对象虽然值相同但引用地址不同。这道题考察的是字符串常量池和引用比较笔试中属于必考难度需要理解得特别透彻。2.2 集合框架ArrayList、LinkedList和HashMap的底层追问集合这块爱奇艺的笔试倾向于考察“底层结构适用场景”的组合题。比如下面这几道高频题说说ArrayList和LinkedList的区别。HashMap在JDK 7和JDK 8中的底层实现有什么不同HashSet如何保证元素不重复fail-fast机制是什么为什么ConcurrentHashMap能避免fail-fast前两个问题几乎是必问。ArrayList底层是数组查询O(1)、插入删除O(n)LinkedList底层是双向链表插入删除O(1)但需要先定位到节点实际性能未必更优。HashMap在JDK 8中引入了红黑树当链表长度超过阈值8且数组容量达到64时链表会树化目的是降低极端哈希冲突下的查询时间从O(n)降到O(log n)。有一个细节很多同学会忽略HashMap的初始容量是16负载因子是0.75这意味着当元素数量超过16*0.7512时就会触发扩容。为什么是0.75这是时间复杂度和空间占用之间的平衡太高了容易发生哈希冲突太低了浪费空间。笔试的多选题里如果你看到“负载因子越大空间利用率越高但查询效率越低”这个选项它是对的。我建议你把HashMap源码中的几个关键方法比如putVal、resize、treeifyBin至少通读一遍不要只记结论。笔试虽然不考源码默写但很多选择题的选项就是从源码细节里抠出来的。2.3 异常与JVMOutOfMemoryError到底是怎么来的搜索热度里有一个词是“java: outofmemoryerror: insufficient memory”这其实是JVM启动时的报错和笔试题里说的OOM不完全是一回事。笔试中的考察点是Java内存区域有哪些哪一块区域会抛OutOfMemoryError哪一块会抛StackOverflowError先记住这张表内存区域存储内容可能抛出的异常程序计数器当前线程执行的字节码行号无虚拟机栈局部变量表、操作数栈、方法返回地址StackOverflowError / OutOfMemoryError本地方法栈native方法调用StackOverflowError / OutOfMemoryError堆对象实例、数组OutOfMemoryError方法区/元空间类信息、常量、静态变量OutOfMemoryError笔试里经常给出一个场景让你判断内存溢出发生在哪个区域。比如“无限创建线程导致无法分配新线程栈”属于虚拟机栈OOM“大量创建对象没有释放”属于堆OOM“加载了大量类导致元空间不足”属于方法区OOM。这种题只要你把每个区域负责什么背熟基本就是送分题。垃圾回收也是高频考点重点掌握可达性分析算法、Minor GC和Full GC的触发条件、以及常见GC收集器的适用场景。爱奇艺的试卷里出现过“哪些对象可以作为GC Roots”的多选题答案包含虚拟机栈中引用的对象、方法区中静态属性引用的对象、方法区中常量引用的对象、本地方法栈中JNI引用的对象。注意Thread对象本身不是GC Root但它可以被虚拟机栈引用所以需要区分开。3. 多线程与并发爱奇艺笔试中反复出现的硬骨头3.1 线程创建方式与生命周期不要只记得两种创建线程有几种方式很多人脱口而出继承Thread、实现Runnable。但严格来说还有实现Callable接口和线程池创建两种方式。笔试题目如果问线程池内部的线程是如何创建的实际上是通过ThreadFactory创建的也就是说最终还是走了new Thread这条路但这个new Thread是在池子内部完成的。线程生命周期图是必考内容NEW新建、RUNNABLE可运行、BLOCKED阻塞、WAITING等待、TIMED_WAITING计时等待、TERMINATED终止。高频考法有两种一是给出一段代码问当前线程处于什么状态二是给出状态转换的选项让你选出正确的一条路径。有个容易混淆的地方调用sleep方法后线程进入TIMED_WAITING而调用wait方法后线程进入WAITING不带超时参数时。sleep不释放锁wait释放锁。这两个点放在一起考错误率特别高。还有一道经典代码题考察的是线程安全问题public class Counter { private int count 0; public void increment() { count; } public int getCount() { return count; } }两个线程各自调用increment方法10000次最终count一定等于20000吗答案是否定的。count这行代码在字节码层面是“读取-修改-写入”三步操作两个线程同时执行时会出现覆盖写的问题。要解决可以在increment方法上加synchronized或者使用AtomicInteger。3.2 synchronized与Lock、volatile与线程池面试官眼中真正的分水岭爱奇艺的笔试里并发编程部分的压轴题通常集中在synchronized和ReentrantLock的区别是什么volatile能保证原子性吗它到底保证了什么线程池的核心参数有哪些execute和submit有什么区别这三个问题我在模拟面试时几乎每次都会问到。synchronized是JVM层面的关键字ReentrantLock是JDK提供的类。synchronized发生异常时JVM会自动释放锁ReentrantLock需要手动释放通常放在finally里。synchronized不可中断ReentrantLock可以设置超时时间尝试获取锁。在JDK 6之后synchronized经过锁升级优化性能已经不输ReentrantLock。volatile的语义是可见性和有序性它不保证原子性。一个经典的错误用法是在多线程环境下用volatile修饰int变量并执行自增操作这会导致数据不一致。正确场景是状态标志位、单例模式中的double-checked locking。线程池是并发里的重中之重。笔试里考得最多的就是ThreadPoolExecutor的七个参数以及拒绝策略的选择策略。七个参数分别是核心线程数corePoolSize、最大线程数maximumPoolSize、空闲存活时间keepAliveTime、时间单位unit、阻塞队列workQueue、线程工厂threadFactory、拒绝策略handler。实际工作中核心线程数和最大线程数的设置取决于任务是CPU密集型还是IO密集型。CPU密集型推荐核心线程数N1IO密集型推荐N*2或者更大N是CPU核心数。笔试如果给具体场景让你选你就按这个思路去推。还有一个高频考点线程池提交任务后的执行顺序。当提交的任务数超过corePoolSize时不会立即创建新线程而是先放入阻塞队列当队列满了才会创建线程直到maximumPoolSize如果线程数达到最大值且队列也满了才会触发拒绝策略。这个流程必须记清楚很多多选题就是围绕这个顺序展开的。4. 数据结构与算法编程题手撕代码的得分关键4.1 排序算法这次笔试大概率会考快速排序或冒泡搜索热词中有“冒泡排序java”和“快速排序java实现”说明排序算法在Java面试中的认知度相当高。爱奇艺的编程题通常不会直接说“请写一个快速排序”而是通过一道具体题目让你隐式地用到排序。例如给定一个整数数组请找出第K大的元素或者对多个字符串按字典序排序后拼接成最小的字符串。这类题目最优解法就是排序加贪心所以排序算法基本功必须扎实。我先把快速排序的Java实现放在这里这是笔试手撕代码的高频模板public class QuickSort { public static void quickSort(int[] arr, int left, int right) { if (left right) { return; } int pivotIndex partition(arr, left, right); quickSort(arr, left, pivotIndex - 1); quickSort(arr, pivotIndex 1, right); } private static int partition(int[] arr, int left, int right) { int pivot arr[left]; int index left 1; for (int i left 1; i right; i) { if (arr[i] pivot) { swap(arr, i, index); index; } } swap(arr, left, index - 1); return index - 1; } private static void swap(int[] arr, int i, int j) { int temp arr[i]; arr[i] arr[j]; arr[j] temp; } }快速排序的平均时间复杂度是O(n log n)最坏情况是O(n²)。最坏情况发生在每次选取的基准值都是当前区间的最小值或最大值时也就是数组已经有序的情况下。所以实际工程中我们通常采取三数取中法选择基准值来规避这个问题。笔试中如果要求优化可以考虑改成随机选取基准值。冒泡排序也有一个高频优化点如果某一轮遍历中没有发生任何交换说明数组已经有序可以提前终止。经典实现如下public static void bubbleSort(int[] arr) { int n arr.length; boolean swapped; for (int i 0; i n - 1; i) { swapped false; for (int j 0; j n - 1 - i; j) { if (arr[j] arr[j 1]) { swap(arr, j, j 1); swapped true; } } if (!swapped) { break; } } }这个提前终止的优化在笔试中如果你能写出来并且解释清楚原因是很加分的。它说明你不仅会背代码还理解冒泡排序的本质——逆序数归零的过程。4.2 链表反转手写频率最高的链表题没有之一爱奇艺的编程题里链表题出现的频率不低。链表反转就是最基础的模板题迭代法如下public class ListNode { int val; ListNode next; ListNode() {} ListNode(int val) { this.val val; } ListNode(int val, ListNode next) { this.val val; this.next next; } } public ListNode reverseList(ListNode head) { ListNode prev null; ListNode curr head; while (curr ! null) { ListNode nextTemp curr.next; curr.next prev; prev curr; curr nextTemp; } return prev; }这里的关键点在于每次反转时必须先暂存curr.next否则修改指针后会丢失后续节点。很多同学第一次手写链表反转时都会在这里卡住所以我建议你在草稿纸上把每一步的指针变化画出来特别是要理解prev、curr、nextTemp三个指针在每一轮迭代中的移动关系。链表题的考察难度通常分为三个等级第一级是反转、找中间节点、判断是否有环第二级是合并两个有序链表、删除倒数第N个节点第三级是K个一组翻转链表、排序链表。笔试中第一级出现概率最高第二级次之第三级一般出现在面试环节。如果你时间有限优先把第一级练熟。另外提醒一点笔试环境下的OJ系统对代码格式要求很严格类名必须是Main、方法签名必须完全匹配、不能输出多余的调试信息。这些细节平时在IDE里注意不到但在真实笔试环境中直接决定你是否能通过用例。4.3 字符串与数组高频题型的通用解法字符串处理在笔试编程题里也占一席之地。典型题目包括最长公共前缀、字符串反转、判断回文串、字符串中的第一个唯一字符。数组类的题目则经常考察两数之和、三数之和、数组去重、合并两个有序数组、移动零。以两数之和为例最优解法是用哈希表把时间复杂度降到O(n)public int[] twoSum(int[] nums, int target) { MapInteger, Integer map new HashMap(); for (int i 0; i nums.length; i) { int complement target - nums[i]; if (map.containsKey(complement)) { return new int[]{map.get(complement), i}; } map.put(nums[i], i); } return new int[]{}; }这类题目的核心思想是空间换时间。笔试中如果遇到数组和字符串相关的题目第一步先想清楚暴力解法能不能过暴力过不了再考虑哈希表、双指针、滑动窗口这些优化手段。不要一上来就套模板先把题目问的场景分析清楚。5. 计算机网络与数据库速刷笔试不能丢的分5.1 TCP三次握手与HTTP状态码高频考点速记计算机网络在Java笔试题中的占比不高但几乎必考。最常考的是TCP三次握手和四次挥手的过程、TCP与UDP的区别、HTTP和HTTPS的区别、常见状态码的含义。关于三次握手我建议你这样记客户端先发SYN服务端回SYNACK客户端再回ACK。核心目的是确认双方的收发能力都正常。为什么不是两次因为两次握手无法确认客户端的接收能力是否正常。为什么不是四次因为四次浪费了一次不必要的通信开销。HTTP状态码里笔试常考的是200请求成功301永久重定向302临时重定向304客户端缓存资源未过期使用缓存400客户端请求语法错误401未认证403服务器拒绝请求404资源不存在500服务器内部错误502网关错误有一道高频题是访问一个不存在的页面时服务器返回404这说明请求已经被服务器接收并处理了只是资源不存在。401和403的区别也经常考401是“你没有登录”403是“你登录了但没有权限”。5.2 数据库索引与SQL优化笔试中区分度最大的考点数据库部分爱奇艺的笔试重点放在索引和SQL语句上。索引这块必考的是B树索引结构、主键索引与二级索引的区别、最左前缀原则。先说为什么MySQL的InnoDB引擎选择B树而不是B树或哈希索引。B树所有数据都存在叶子节点非叶子节点只存索引键所以相同大小的节点能容纳更多键值树的高度更矮查询IO次数更少而且叶子节点通过链表相连范围查询只需要顺序遍历叶子节点即可。哈希索引单点查询快但不支持范围查询。这些理由笔试简答题里直接写上就能拿分。最左前缀原则是联合索引的灵魂CREATE INDEX idx_name_age_gender ON user(name, age, gender);这条SQL可以命中索引的查询条件组合是哪些WHERE name 张三命中WHERE name 张三 AND age 20命中WHERE name 张三 AND age 20 AND gender 男命中WHERE age 20 AND gender 男不命中因为跳过了最左列如果遇到WHERE后面条件的顺序是反的比如WHERE gender 男 AND name 张三MySQL优化器会做等价转换依然命中索引。所以最左前缀说的是查询条件中必须包含联合索引的最左列而不是书写顺序。SQL优化方面注意避免在索引列上使用函数或计算避免使用SELECT *避免隐式类型转换导致索引失效。这些考点在选择题中经常以“下列哪项会导致索引失效”的形式出现。5.3 事务隔离级别四个级别的区分是送分题还是陷阱题数据库事务隔离级别也是一个高频考点尤其是和脏读、不可重复读、幻读对应关系。隔离级别脏读不可重复读幻读读未提交READ UNCOMMITTED可能可能可能读已提交READ COMMITTED避免可能可能可重复读REPEATABLE READ避免避免可能InnoDB可避免串行化SERIALIZABLE避免避免避免这里有个特别容易出错的知识点MySQL的InnoDB存储引擎在可重复读隔离级别下通过MVCC间隙锁解决了幻读问题但严格来说标准的SQL可重复读隔离级别并不能完全杜绝幻读。笔试如果问“MySQL默认隔离级别及存在的问题”答案应该是MySQL默认可重复读InnoDB通过间隙锁解决了幻读。如果问“SQL标准中可重复读隔离级别存在的问题”答案则是“无法完全避免幻读”。这两种问法答案不一样一定要看清题目问的是标准还是MySQL。6. 备考策略与踩坑经验从笔试到一面之间要做的事6.1 时间分配与做题顺序先把能拿的分稳稳拿下笔试时间是固定的能不能答完和知识储备有关也和时间分配策略有关。我推荐的做题顺序是数组、字符串、链表类编程题优先做因为这类题思路清晰写起来快然后做单选和判断最后留时间给需要深入思考的算法题和简答题。编程题如果卡住超过15分钟建议先跳过不要在一道题上死磕。因为评卷通常是按用例通过比例给分你写出一个能通过部分用例的版本远比提交一个空文件或者报错的代码有优势。哪怕只能处理数组长度为1的特殊情况也要把框架写出来拿到部分分。有同学问要不要在编程题里先写注释理清思路我的建议是如果考场环境允许在代码块外先列出解题步骤是个好习惯但不要在代码内写大量与逻辑无关的注释会拖慢速度。思路理清楚快速落码才是关键。6.2 我整理的一份复盘清单从这份试卷延伸到真正的面试能力做完这份爱奇艺笔试题我建议你顺手做几件事把“会做题”转化成“真会了”第一把错题对应的知识点回归到源码或文档。比如HashMap的树化条件不要只背“链表长度超过8”要去看源码里为什么是8以及为什么在数组容量不足64时只会扩容而不会树化。这是从“背结论”到“懂原理”的必经之路。第二把代码题的关键实现整理成自己的模板。不只是快速排序和链表反转还有二分查找、二叉树遍历、递归转迭代、滑动窗口等常见模板。笔试时间紧现场临时推导的代码出错概率远高于温故过的模板代码。第三把自己做错的简答题扩展成一段可以口头表达的内容。笔试和面试的界限越来越模糊笔试里你写的答案面试官很可能在下一轮直接拿出来追问。比如你答了“volatile保证可见性”面试官会继续问“它是如何保证可见性的”“加了volatile就一定线程安全吗”这些追问才是真正的考验。第四建立属于自己的“易错点清单”。比如final、finally、finalize的区别重载和重写的区别和equals的区别ArrayList的扩容倍数等等。这些知识点单独看都不难但放在多选题里组合起来就是最容易丢分的地方。我个人在辅导学生做这套题时最深的体会是笔试考的不是你“知道”多少而是你在有限时间内能“准确”输出多少。很多知识平时聊天都能聊出来一上考场选择题四个选项放在一起就开始犹豫。这种犹豫的本质是概念边界不够清晰。所以刷题之后一定要做错题复盘把每个模糊的概念打磨到“能在半分钟内给出确定答案”的状态。最后再分享一个小技巧做笔试题时遇到拿不准的多选题宁可不选也不要乱选。因为多数平台的计分规则是错选多选都不得分但漏选可能得部分分。看清楚题目说明里的计分规则再决定策略这种细节往往决定了你和别人在同样知识储备下谁能过线。把这份试卷的考点按上面说的方式消化掉你收获的不只是一次模拟成绩而是一整套Java岗位的核心知识图谱。祝你在笔试环节旗开得胜。
返回列表