ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

网易Java开发笔试复盘:算法与Java基础双线备考全攻略

网易Java开发笔试复盘:算法与Java基础双线备考全攻略 今年八月中下旬2023届秋招提前批基本进入白热化阶段我投了网易的Java开发工程师提前批岗位。网易的流程走得比大部分公司都快投完简历一周左右就收到了笔试链接。当时一起蹲笔试的朋友不少大家最关心的就是网易笔试到底考什么、难度梯度怎么分布、Java岗有没有特殊的侧重点。这篇文章我把整场笔试从题型到考点完整复盘一遍结合我自己的作答情况和考后整理给后面准备网易或者其他大厂Java岗笔试的同学一份可以直接参考的备考路线。先说结论网易2023校招提前批的Java开发工程师笔试整体是“算法题为主、Java基础为辅、计算机基础不能丢”的组合拳。算法题占了绝对大头但Java基础题的量也不少而且考得非常细致很多都是平时写业务代码根本碰不到的边角料知识点。如果你只刷LeetCode不背Java基础笔试可能过不了反过来只背八股不刷算法大概率也悬。1. 笔试整体情况题型分布与考察维度拆解1.1 考试平台与时长的真实体验网易这批提前批用的是牛客网的在线笔试系统时长一共120分钟。说实话这个时长看着挺充裕实际做起来完全是另一种感觉——因为题量真不小。我这边收到的试卷包含4道编程题外加20道左右的选择题和填空题其中选择题涵盖了Java基础、计算机网络、操作系统和数据库几个方向。牛客系统有几个点要提前适应一是编程题不支持本地IDE只能在网页上写虽然可以自行用main函数调试但提示和补全都很弱二是切出浏览器标签页会被记录切换次数太多可能触发警告三是提交代码后只有用例通过率没有具体错误信息只能自己打印调试。这几个限制对平时依赖IDE提示的同学来说是个不小的挑战。建议提前用牛客网的模拟笔试功能熟悉两三次重点适应“没有智能提示、自己管理import、手动构造测试用例”的代码题作答节奏。这个投入非常值因为很多人在笔试里不是不会做而是被平台搞得心态崩了。1.2 考点维度的整体扫描从我这场笔试来看网易Java岗的考察可以分成四个维度第一维度是算法与数据结构4道编程题基本覆盖了这个方向难度从简单到中等偏上递增涉及字符串处理、数组操作、动态规划和树结构的遍历。第二维度是Java语言本身的底层原理选择题里有大量关于JVM内存结构、类加载机制、集合框架底层实现、并发工具的问题这个方向是最能拉开差距的地方。第三维度是计算机通用基础包括TCP/IP协议、操作系统进程调度、MySQL索引和事务隔离级别。第四维度是代码阅读与排错能力它会给出几段有问题的Java代码让你判断输出结果或找出运行异常的原因。这个考察结构挺有代表性的基本就是一线大厂Java岗笔试的主流形态。后面几个章节我就按这几个维度逐项拆解每个部分都会放上具体的题目类型、作答思路和复习建议。2. 算法题复盘四道题完整回顾与解题思路2.1 第一题字符串压缩与展开简单这道题大意是给定一个经过特殊压缩的字符串比如a3b2c4需要输出展开后的结果aaabbcccc同时允许嵌套场景比如a2b3c2这种。要求实现一个expandString的方法输入字符串长度不超过1000输出展开后的完整字符串。这题其实就是经典的字符串处理核心是遍历时区分字符和数字。我当时用的思路是顺序扫描用一个StringBuilder存储结果遇到字母就记下当前字符如果是数字就先累加成整数然后追加对应次数的字符。需要注意的坑点是数字可能不止一位比如a12b3所以处理连续数字时要走一个内层循环完整读掉。网易这题应该不要求处理嵌套括号压缩但我还是顺手实现了递归解嵌套的版本以防万一。代码结构大概是这样public String expandString(String s) { StringBuilder sb new StringBuilder(); int i 0; while (i s.length()) { char c s.charAt(i); if (Character.isLetter(c)) { char letter c; i; int count 0; while (i s.length() Character.isDigit(s.charAt(i))) { count count * 10 (s.charAt(i) - 0); i; } for (int j 0; j count; j) { sb.append(letter); } } else { i; } } return sb.toString(); }这种题目难度不大但很考验基础代码能力尤其是边界条件。我当时额外考虑了几种输入空字符串、只有字母没有数字、数字为0的情况。实际测试中这些边界用例占比很高漏一个可能就过不了全量测试。2.2 第二题拓扑排序变体中等偏易第二题给了一个课程依赖的场景有N门课程编号从0到N-1给定若干依赖关系[a, b]表示学a之前必须先学b要求判断是否存在一种学习顺序能完成所有课程。如果有输出任意一种合法顺序如果没有输出空数组。这题在LeetCode上有原题课程表系列但网易加了一个额外的输出要求——不仅要判断能不能学完还要输出具体的顺序。所以这道题实质上就是拓扑排序的裸题考的是DFS或BFS实现。我当时用的Kahn算法BFS拓扑排序维护每个节点的入度数组和邻接表先把所有入度为0的节点入队然后依次出队、减少后继节点的入度最后判断生成的序列长度是否等于N。这个算法时间复杂度O(VE)空间也是O(VE)对于题目的数据规模完全够用。唯一要注意的是题目输入的依赖方向是[a, b]表示a依赖b还是b依赖a这个搞反了输出就会完全错误。建议读题后先在草稿上画一个简单用例验证方向比如输入[1, 0]如果表示学1之前先学0那0应该在1前面。2.3 第三题动态规划之最长递增子序列中等第三题比较常规给定一个整数数组求最长递增子序列的长度。比如[10, 9, 2, 5, 3, 7, 101, 18]最长递增子序列是[2, 3, 7, 101]长度为4。这题有两种主流解法第一种是动态规划dp[i]表示以第i个元素结尾的最长递增子序列长度转移时遍历j i且nums[j] nums[i]取最大值加1时间复杂度O(n²)。第二种是贪心加二分维护一个tail数组用二分查找找到当前元素在tail中的插入位置时间复杂度O(n log n)。网易的数据规模我不清楚但为了保险直接上了O(n log n)的解法。核心代码用Arrays.binarySearch处理插入位置需要注意的是返回值的处理如果返回负数需要转换成插入点-res - 1。这题虽然不算难但它考察的是动态规划的基础优化思维。如果你只掌握O(n²)的解法在小数据量下也能过但万一遇到大数据量的测试点就可能超时。实际笔试里我不会贸然选择O(n²)直接一次写对最优解最稳。2.4 第四题二叉树的层序遍历变体中等偏上第四题是二叉树的锯齿形层序遍历也就是第一层从左往右、第二层从右往左、第三层再从左往右这样交替输出。LeetCode 103原题核心是用BFS加一个层号标记偶数层正常入结果奇数层反转后再入结果。我在实现时用了一个双端队列来优化避免每次反转的开销从左往右的层从尾部添加到结果从右往左的层从头部添加到结果。不过实际笔试时直接用一个布尔变量标记是否需要反转出结果时决定Collections.reverse还是直接添加也完全没有问题。这类题考察的是对BFS层序遍历的变通能力。网易出这道题说明他们很重视二叉树基本功尤其是对遍历顺序的敏感度。做题时还要注意空树的边界情况返回值应该是空列表而不是null这个细节很多人会忽略。2.5 算法题的整体策略心得四道题做下来我的最大感受是网易的算法题难度上限没有到竞赛级但覆盖面广、细节要求高。第一和第二题属于“必须拿满分”的保底题第三题要快准稳地写出最优解第四题是拉分题但思路不偏不怪。做题顺序上我建议先快速扫描四道题标记难度然后从易到难逐个击破不要在第一题上过度追求优雅解法而浪费时间。我给自己定的规则是每道题读题加思考不超过10分钟没有思路就跳过做完后面再回来补。这样至少能保证保底题全部写完不会出现会做的题没时间做的情况。另外一个很实用的技巧是写代码前先在注释里把思路写出来包括输入输出、算法步骤、边界条件这样写代码时思路不会乱。笔试环境不像IDE那么好用提前规划好再动手能减少大量调试时间。3. Java基础选择题复盘八股文怎么考、怎么答3.1 JVM内存区域与GC机制考察密度最高网易这场笔试的选择题里JVM相关内容出现频率非常高几乎是每两三题就有一题。考察最集中的两个点是内存区域划分和垃圾回收。比如有一道题给了四个选项分别描述堆、栈、方法区、程序计数器的作用要求选出说法错误的一项。这种题表面考记忆实际上考的是理解深度。堆是所有线程共享的区域存放对象实例同时是GC的主要工作区域。虚拟机栈是线程私有的每个方法调用都会创建一个栈帧里面存放局部变量表、操作数栈、动态链接和方法出口。方法区在JDK 8之后改名为元空间存储类信息、常量、静态变量。程序计数器是线程私有的记录当前线程执行的字节码行号是唯一不会出现OutOfMemoryError的区域。这里有一个容易混淆的点静态变量到底存放在哪里JDK 8之前存在方法区JDK 8之后存在堆中但逻辑上仍属于方法区。笔试里经常拿这个来挖坑。GC方面网易考察了可达性分析算法和常见的垃圾收集器。题目大概是给出一段程序问哪些对象在GC Roots扫描时可以被回收。这就要搞清楚GC Roots包含哪些虚拟机栈中引用的对象、方法区中静态属性引用的对象、方法区中常量引用的对象、本地方法栈中JNI引用的对象。我复习时最大的感触是JVM题如果没有系统看过《深入理解Java虚拟机》的前几章光靠网上搜零散资料是不够的因为题目的切入角度总是很刁钻。3.2 集合框架底层原理HashMap是绝对主角Java集合方向的题目HashMap占了半壁江山。网易倒没有出那种“HashMap的put过程简述”的大题而是选择了很细节的小点。比如有一个选项问当链表长度达到多少时链表会转化为红黑树这个阈值是8而在数组长度小于64时会优先扩容而不是树化。还有一道题考了HashMap的容量计算给定初始容量7实际HashMap会扩容到多少这个考的是tableSizeFor方法会把容量调整为大于等于给定值的最小2次幂也就是8。这些细节如果平时只是“会用HashMap”但不看源码基本只能靠猜。ConcurrentHashMap也出现了一道题问JDK 8中它的线程安全是怎么实现的。答案是CAS加synchronized对数组中的每个桶的节点进行加锁锁粒度比JDK 7的Segment更细。我复习时对比了HashMap和Hashtable的区别也把ConcurrentHashMap的源码过了一遍所以这题比较稳。ArrayList和LinkedList的区别也考了但角度非常基础查找和插入的时间复杂度。值得注意的是网易没有直接问“哪个快哪个慢”而是给出了一个具体的操作场景比如“频繁在列表头部插入元素用哪个合适”这种题目说到底是考数据结构的基本原理。3.3 并发编程synchronized、volatile与线程池并发编程方面网易考了三个点synchronized的锁升级过程、volatile的两个语义、线程池的拒绝策略。synchronized锁升级考得很细致题目的问法是“无锁状态经过哪些步骤升级为重量级锁”。正确顺序是无锁、偏向锁、轻量级锁、重量级锁。其中偏向锁在JDK 15之后已经被默认禁用但这道题考的显然是JDK 8时代的机制所以按经典版本作答即可。volatile考察的是可见性和禁止指令重排序不保证原子性。题目给了一个多线程累加的例子问用volatile修饰的变量最终结果是否一定正确。答案是否定的因为i不是原子操作。这题考的是面试里最经典的“volatile不能替代synchronized”场景。线程池那题考的是ThreadPoolExecutor的四种拒绝策略AbortPolicy抛异常、CallerRunsPolicy调用者执行、DiscardPolicy直接丢弃、DiscardOldestPolicy丢弃队列中最老的任务。题目给了具体场景问选哪个结合场景判断就好。3.4 Java语法细节从枚举到异常再到Lambda除了底层原理网易也考了不少Java语法层面的细节题。有一题考了枚举类型的使用问枚举类能否继承其他类答案是不能因为枚举默认继承java.lang.Enum。还有一题考了Java 8的Lambda表达式问下列哪个接口可以用Lambda实例化选项里有接口没有抽象方法的、有多个抽象方法的、有且仅有一个抽象方法的。这题考的是函数式接口的定义有且仅有一个抽象方法可以用FunctionalInterface注解标识。异常体系也有一题问下列哪个属于受检异常checked exception选项有IOException、RuntimeException、NullPointerException、ArrayIndexOutOfBoundsException。这里是基础中的基础IOException是受检异常后面三个都是运行时异常。Java语法这块我复习时主要靠的是《Java编程思想》和Java官方文档外加刷牛客上的Java练习题。语法题难度不高但因为覆盖面广很容易遇到没见过的点所以备考时不能只盯热点内容还要把基础语法过一遍。4. 计算机基础与场景题不能丢的分4.1 计算机网络TCP握手与HTTP状态码计算机网络的选择题考了两道一道是TCP三次握手另一道是HTTP状态码。TCP那题问的是第二次握手时服务端发送的报文标志位是什么。答案是SYN和ACK同时置1。这里有一个容易混淆的点第一次握手客户端发送SYN第二次服务端回复SYNACK第三次客户端发送ACK。很多人默认第二次只是ACK忽略了SYN标志位这题就是挖这个坑。HTTP状态码那题给了几个常见码要求匹配含义。200表示成功、301表示永久重定向、302表示临时重定向、403表示服务器拒绝请求、404表示资源不存在、500表示服务器内部错误。网易出的具体场景是“用户访问一个不存在的页面时返回什么状态码”答案自然是404。这个题过于基础基本是送分题但也是不能丢的分。网络这块的建议是把TCP三次握手四次挥手的状态变迁、HTTP常见状态码、HTTP和HTTPS的区别、TCP和UDP的区别这几个高频考点背熟即可。如果时间充裕再补充一下HTTP报文结构和DNS解析流程基本够用。4.2 操作系统进程线程与死锁操作系统方向网易考了一道进程和线程的对比题问你“同一进程内的多个线程共享什么不共享什么”。共享的是进程的地址空间、全局变量和打开的文件描述符不共享的是线程的栈和寄存器。这个考点几乎是操作系统必考题但一定会有人在这里丢分因为不共享的部分太容易被忽略。死锁那道题考的是四个必要条件互斥、持有并等待、不可剥夺、循环等待。题目给出了一个实际场景问打破了哪个条件就不会死锁。场景是“多个线程按相同顺序加锁”这其实破坏了循环等待条件。这类题考的是把理论对应到实际的能力复习时建议把四个条件各想一个对应的代码场景理解会更深刻。4.3 MySQL索引与事务隔离级别数据库方向考了索引和事务隔离级别两个点。索引题问的是InnoDB的索引结构是什么答案是B树并解释了为什么不用B树或哈希B树支持范围查询、数据都在叶子节点且叶子节点用链表连接遍历效率高。哈希索引适合等值查询但不适合范围查询。事务隔离级别题给出了四种级别读未提交、读已提交、可重复读、串行化问InnoDB默认的隔离级别是哪个。答案是可重复读。MySQL通过MVCC实现可重复读同时用间隙锁解决了一部分幻读问题。这类题如果只背默认级别而不理解MVCC的原理换一个问法就可能答不上来。数据库复习建议以索引和事务为核心把聚集索引与非聚集索引的区别、覆盖索引、事务的ACID特性、脏读不可重复读幻读的区别全部整理成自己的笔记。这块是Java开发日常工作最常接触的内容笔试考察频率也一直很高。5. 备考路线与实操建议照着准备就对了5.1 Java学习路线的关键节点我在准备网易这批提前批之前其实已经系统过了一遍Java相关的核心知识。如果你现在离笔试还有两到三个月建议按下面的路线走这是我自己验证过比较高效的顺序第一阶段是Java基础语法夯实包括面向对象三大特性封装、继承、多态、集合框架的使用与底层原理、异常体系、泛型、枚举、Lambda和Stream。这个阶段重点是会用能写代码不要一上来就啃JVM。第二阶段是Java并发编程先把synchronized、volatile、ReentrantLock、ThreadLocal、线程池这几个核心知识点吃透再做一个简单的并发编程小项目巩固。第三阶段是JVM重点看内存区域、垃圾回收算法和收集器、类加载机制、JVM调优命令。第四阶段是计算机基础补强也就是网络、操作系统、数据库三板斧。第五阶段是算法刷题这个最好每天固定1到2小时。5.2 算法题刷题策略不盲目刷量算法题是笔试中占分最多、区分度最大的部分但也是最容易走弯路的部分。我自己的刷题经验是不要按题号顺序刷LeetCode而是按专题分类刷。先把数组、链表、栈、队列、哈希表、字符串这些基础数据结构专题搞定再刷二叉树、图、动态规划、贪心这些进阶专题。每个专题内部按难度递进简单题练思路、中等题练实现、难题练思维。刷题时不要直接看题解至少要独立思考20分钟没有思路再看题解并且看完题解后马上自己独立重写一遍。这样做的目的是让脑子真正参与解题过程而不是把题解抄一遍就觉得自己会了。笔试前一周强烈建议用牛客网的真题模式做三到五场完整模拟。这个环节不只是检验知识更是训练时间分配和心态管理。我第一次模拟的时候算法题只做了两道半时间就到了后来调整了做题顺序才勉强做完。这种经验只有在模拟里才能获得真到了笔试现场再来调整就太晚了。5.3 Java八股文的整理方法现在网上把Java面试常考的基础知识叫作“八股文”意思好像是死记硬背、脱离实际。但我的理解不一样八股文背后对应的其实是Java的基础原理只是大家把它们总结成了固定问答模式。对于笔试来说这些基础题真的就是核心考点不背是真不行。我整理八股文时用的方法是“题干结论原理代码示例”四段式。比如JVM内存区域这个知识点题干是“JVM运行时数据区有哪些区域”结论是五块区域原理是每块区域的作用和线程共享情况代码示例是一个展示栈溢出或堆溢出的例子。这样整理出来的笔记既能应付选择题也能应对后面的面试环节。不过要提醒一点八股文不能只背不看源码特别是HashMap、ConcurrentHashMap、synchronized这几个高频点一定要打开JDK源码自己读一遍。笔试里很多选项的设计就是直接从源码里截出来的。只要亲自读过源码这类题基本一看就知道答案不需要死记。5.4 笔试当天的时间分配技巧最后分享一个笔试当天的时间分配和心态管理方案这是我踩了不少坑之后总结出来的。拿到试卷后不要急着做题先把整张卷子浏览一遍标记出自己把握大的题和没思路的题。选择题控制在40分钟以内编程题每道20到25分钟。我的策略是先做简单的编程题保底再做选择题最后集中攻克难题。因为选择题如果卡住了可能5分钟也做不出来编程题如果没思路那是真的一点办法也没有所以优先做有把握的题是最划算的。如果遇到完全没思路的编程题不要硬扛超过15分钟。直接把它标记为“待处理”继续做其他题目。等所有能拿的分都拿完之后再回来啃难题哪怕只能写出暴力解法也比空着强。很多时候暴力解法的用例通过率也能有30%到50%这些分数在笔试筛选中可能比你想象的更重要。代码题即使没有完全通过也尽量不要留空白。先把题的输入输出解析写好再加上一个暴力解或者部分正确的思路然后把注释写清楚。网易的笔试系统虽然只看通过率但通不通过和你的整体卷面情况有关系能多拿一分是一分。写在最后网易2023校招提前批的Java开发工程师笔试整体给我的感觉是风格扎实、不偏不怪但考察面非常广。算法题占大头但难度适中Java基础题量大且细节多计算机基础属于“复习了就稳拿、不复习就干瞪眼”的类型。对我个人来说最大的收获倒不是拿到了面试机会而是通过这场笔试我把自己的Java知识体系重新整理了一遍很多原本模棱两可的概念都在这轮备考中彻底搞清楚了。无论你现在是刚开始准备还是已经刷了不少题我都建议你拿网易的真题做一次全真模拟用它来检验自己的备考进度。重点盯住算法题的熟练度和Java基础选择题的正确率这两块能稳住的话通过笔试的把握就很大了。
返回列表