news 2026/9/13 10:44:58

网易Java校招笔试题复盘:从集合源码到工程素养的底层能力考察

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
网易Java校招笔试题复盘:从集合源码到工程素养的底层能力考察

拿到这份卷子的时候我其实愣了一下。网易2018校园招聘Java开发工程师(BJ)笔试卷,网上流传的版本不算少,但真正能沉下心把它当成一份教材来研究的人不多。大多数人的做法是考前刷几道选择题、背一背HashMap源码、临时抱佛脚看两眼快速排序,然后进考场听天由命。这份卷子最大的价值不在于它的题目本身有多难,而在于它暴露了Java校招笔试的筛选逻辑:它不考你会不会用某个框架,不考你背了多少八股文,它考的是你在没有IDE、没有搜索引擎、只有一个编辑器的情况下,对Java这门语言和计算机基本功的理解到底有多深。

我前后带过不少实习生,也帮着部门出过几次笔试题,回头看这份2018年的卷子,发现里面的考点放到现在依然是主流——集合源码、JVM内存、多线程、排序算法、场景设计,年年都在换题,内核从来没变过。这篇文章我把这套卷子的考察结构拆开,每一类题怎么答、坑在哪里、面试官到底想看什么,一条一条讲清楚。不管是准备校招还是在职跳槽,这份复盘都值得你花半小时好好看一遍。

1. 试卷速览:题型布局和它的考察逻辑

先说卷面。网易这套笔试一般安排在线上,时间120分钟左右,题量在40到50题之间,覆盖单选、多选、编程题和设计题四类。从岗位名字“Java开发工程师(BJ)”能看出来,这是一个通用型的开发岗,不是专门的基础架构或中间件岗位,所以框架层面的比重很低,更不会出现“Spring Boot怎么配置Redis集群”这种实操题——笔试阶段根本没法验证你写的是不是真能跑,它只能验证你有没有扎实的底层能力。

我记得整理过那份卷子的题型分布,大致是这样的:

题型题量分值占比考察重点
单选题20题左右约40%Java基础、集合、JVM、并发、网络
多选题5-8题约15%边界条件、细节辨析
编程题2-3题约30%算法、数据结构、代码规范
设计题1-2题约15%面向对象、设计模式、工程思维

这个结构透露了一个关键信息:基础占比特别高,编程题和设计题是拉分项。选择题靠短期记忆能蒙对不少,但编程题必须动手写,没写够或者写错了直接扣大分。网易的笔试系统是本地写代码再上传的,有些年份还要求你填写运行结果,这比纯OJ难一点,因为它会看你的代码风格和变量命名。

再往外想一层,为什么大厂校招笔试都这么出?因为校招和社招不一样,应届生没有真实项目经验可聊,面试官只能通过笔试来确认你“能不能干活”——代码能不能写对,逻辑能不能自洽,遇到问题有没有排查的方向。这套卷子表面上是考Java,背后其实是在筛选“可培养的人”。所以你在复习的时候,不能只背题目答案,得把每道题背后的知识点串起来。

2. 基础选择题:从面向对象到集合源码

2.1 面向对象和重载重写,基础中的基础

单选第一梯队考的一定是面向对象。有一道比较有代表性的题是问“重载和重写的区别”,选项里混杂着“重载是编译期多态,重写是运行期多态”这类说法。我见过很多人在这道题上栽跟头,因为把概念背得很熟,但一看到代码就判断不了。

比如这种:

class Parent { public void say(String msg) { System.out.println("Parent " + msg); } } class Child extends Parent { public void say(Object obj) { System.out.println("Child " + obj); } }

问:当执行Parent p = new Child(); p.say("hello");时,输出是什么?

很多人一看Child里有say(Object),就认为输出Child hello,这是错的。因为say(Object)不是对say(String)的重写,重写要求方法名、参数列表完全一致,只是重载。这里p的静态类型是Parent,编译器匹配到Parent.say(String),而Child并没有重写这个方法,所以会调用Parent的实现,输出Parent hello。这个考点年年都有,本质上是考察“静态类型决定重载,动态类型决定重写”这个底层规则。笔试里不会直接问这句话,但它会换个马甲反复考。

2.2 集合框架:HashMap源码是必背项

集合类在Java选择题里占的份额相当大,特别是HashMap。2018年那会儿HashMap还在用数组加链表,红黑树的逻辑已经引入了,但源码级的问题还不算特别多,更多是问“扩容因子是多少”“什么时候转红黑树”“为什么线程不安全”。放到现在再考,就会追问ConcurrentHashMap的CAS加synchronized实现,但套路是一样的。

我记得有一道多选题问哪些是线程安全的集合类,选项有HashtableVectorCopyOnWriteArrayListArrayList。这里有个容易漏选的项是CopyOnWriteArrayList,因为很多人一看到CopyOnWrite就犹豫,不确定它是不是真的线程安全。事实上它读写分离,写的时候加锁复制新数组,读的时候无锁操作,是一个非常典型的并发容器。漏选的原因往往是把Collections工具类的包装和真正的并发容器搞混了。

还有一道单选我印象很深,给了两行代码:

Map<String, Integer> map = new HashMap<>(); map.put("key", 1); map.put("key", 2);

map.size()是多少,以及map.get("key")是多少。答案是1和2,因为HashMap的put方法是覆盖式写入,key相同就替换value,不会新增节点。看似简单,但能看出你有没有真的理解散列表的存储结构。

2.3 运算符、表达式和位运算

Java基础卷子里,运算符和表达式也是常客。有一类题是考自增运算的执行顺序,比如:

int i = 1; i = i++; System.out.println(i);

我问过不少候选人,很多人答案是2,正确答案是1。原因在于i++先返回旧值1,然后i变成2,最后赋值把旧值1写回i。这种题目技术含量不高,但能筛掉粗心的人。网易的卷子里出现过类似题目,选项设置得很容易让人跳坑,如果你平时只写业务代码,很少盯着这种代码抠细节,很容易丢分。

位运算考的也不少。有一道题是判断a & (a - 1)的作用,正确答案是“判断a是不是2的整数次幂”。这个技巧在很多算法题里都会用到,笔试考它其实是在暗示你,学Java不能光看语法,数据结构和算法的基本功也得跟上。

3. 多选题和概念辨析:边界条件才是拉分点

3.1 String、常量池和不可变性

多选题是这份卷子最容易让人崩溃的部分,因为漏选、多选都算错,它对“准确性”的要求远超单选。有一道经典的题是关于String的不可变性,问以下哪些说法正确:

  • A. String是final类,不可被继承
  • B. String的字符串内容存储在final char数组里
  • C. 两个内容相同的字符串常量一定指向同一个对象
  • D. String的equals方法比较的是内容

A、B、D都算基本正确,C就隐含着陷阱。常量的确会被编译器intern到字符串常量池,但如果你用了new String("abc"),它和常量池里的“abc”就不是同一个对象。所以C不能选。这种题靠背概念是背不出来的,你得理解JVM里字符串常量池的存储机制,以及编译器对字符串字面量的处理方式。

3.2 泛型和类型擦除

泛型也是多选题的高频考点。有一道题问,List<String>在运行时能不能通过反射插入一个Integer对象。答案是能,因为泛型在编译后被擦除了,运行时的List里存的全是Object,类型检查只在编译期生效。很多人不理解类型擦除是什么意思,但它恰恰是Java泛型和C++模板最大的区别,也是面试官非常喜欢挖的一个点。

我还见过一道变体:两个泛型方法void show(List<String> list)void show(List<Integer> list)在同一个类里会不会编译报错。答案是会,因为擦除之后两个方法签名变成void show(List list),完全一样,编译期就冲突了。这类考点考验的不是记忆,而是你能不能顺着“擦除”这个机制推导出结果。

3.3 包装类的缓存与自动拆装箱

关于Integer缓存有一个很经典的题目:

Integer a = 127; Integer b = 127; Integer c = 128; Integer d = 128; System.out.println(a == b); System.out.println(c == d);

第一行输出true,第二行输出false。原因是Integer-128127之间有一个缓存数组,自动装箱的时候会复用缓存对象,超出范围就new新对象。这个知识点本身不复杂,但能引申出很多问题:为什么new Integer(127) == 127返回true?因为自动拆箱把Integer转成了int再比较;为什么new Integer(127) == new Integer(127)返回false?因为比较的是引用地址。一道题能拆成三种问法,多选里就特别喜欢混着考察。

3.4 JVM 内存与 OutOfMemoryError

卷子里一定会有JVM相关的题目,2018年那道我记得是问“下面哪种情况会导致OutOfMemoryError”,选项有:堆内存不足、栈深度溢出、元空间不足、直接内存不足。很多人只敢选“堆内存不足”,结果漏掉了另外几个。

实际上OutOfMemoryError是一个umbrella异常,堆空间不足会抛,方法区或元空间不足会抛,直接内存不足也会抛,甚至创建线程时无法分配原生内存都可能抛。而栈深度溢出通常是StackOverflowError,不是OutOfMemoryError,这是一个很好的干扰项。我在实际工作中碰到过几次OutOfMemoryError: insufficient memory,大部分是堆配小了,但也有一次是C2编译器搞出来的unable to create native thread,这类问题不能用同一个思路排查。

另外一个和JVM相关的坑是版本问题。热词里有人搜“源发行版 17 需要目标发行版 17”,这个报错就是JDK版本不匹配导致的,编译器的发行版本和目标版本不一致。笔试里一般不会直接考这种报错,但它反映了很多人对JVM编译参数的理解不够,所以我在后面会单独讲一下这类环境问题对备考的影响。

4. 编程题实战复盘:排序、列车调度与代码规范

4.1 从快速排序到TopK问题

笔试的编程题一般不会直接让你“写一个快速排序”,那样太裸了,它通常会包装一个场景。有一道题是:给定一个无序数组,找出第K大的元素,要求时间复杂度尽量低。你用它练过快速排序的partition思想,这个题就很简单——每轮partition之后,枢轴左边的元素都比它小,右边的都比它大,你比较枢轴位置和K的关系,决定去左边还是右边继续找。平均时间复杂度是O(n),比先排序再取值O(n log n)要快一个档次。

Java实现大概是这样的:

public int findKthLargest(int[] nums, int k) { return quickSelect(nums, 0, nums.length - 1, nums.length - k); } private int quickSelect(int[] nums, int left, int right, int target) { if (left >= right) return nums[left]; int pivotIndex = partition(nums, left, right); if (pivotIndex == target) { return nums[pivotIndex]; } else if (pivotIndex < target) { return quickSelect(nums, pivotIndex + 1, right, target); } else { return quickSelect(nums, left, pivotIndex - 1, target); } }

这道题考的不是你能不能默写快排,而是你有没有复杂度意识。用Arrays.sort然后直接取倒数第K个也能过,但在批卷人眼里,这是两种完全不同的水平。网易这种公司招人,看的就是你有没有“在有限资源下选择更优方案”的意识。

4.2 列车调度问题:栈和队列的经典场景

热词里出现了“列车调度java”,这其实是一道非常经典的Java编程题,和网易的卷子气质很搭。题目一般是这样的:有一个入口轨道,一个出口轨道,中间有若干条缓冲轨道,列车按一定的顺序驶入,要求按照编号从小到大驶出,求最少需要多少条缓冲轨道。

这个问题本质上是一个贪心加单调栈的问题。每来一辆列车,你要在已有的轨道里找一条“最后一个车厢编号小于当前编号”的轨道放上去,找不到就新开一条。为了让轨道利用率最高,每次都往末尾编号最大的那条轨道放。核心代码如下:

public int minTracks(int[] trains) { List<Integer> tracks = new ArrayList<>(); for (int train : trains) { int index = -1; int maxTail = Integer.MIN_VALUE; for (int i = 0; i < tracks.size(); i++) { int tail = tracks.get(i); if (tail < train && tail > maxTail) { maxTail = tail; index = i; } } if (index == -1) { tracks.add(train); } else { tracks.set(index, train); } } return tracks.size(); }

这种题看起来像离散数学,其实考的是栈、队列、贪心策略这些基本功。网易的卷子有时候会把场景包装得更复杂一点,比如加入“如果有两列火车同一时间到达怎么办”,但核心解法没变。刷题的时候别只盯着LeetCode的编号,这类带实际场景的题目反而更能说明你对数据结构有没有融会贯通。

4.3 数组越界和异常处理:编码习惯的试金石

有一道编程题特别能暴露编码习惯:给定一个二维数组,按某种规则遍历,问你某一步会不会报数组越界异常,如果要加保护,怎么加。很多人直接上手就写matrix[i][j],完全不检查ij的取值范围,结果运行到边缘就抛异常。

笔试里爱考这个,不是因为你不会写判断,而是因为你不写。代码规范这种东西,在笔试阶段就能筛掉一批人。我后来帮部门出题的时候,特意在评分标准里加了一条“边界条件处理占20%”,就是希望候选人能下意识地写出防御性代码。你可以不用Guava的Preconditions,但必须自己判断边界。一个简单的习惯是:凡是涉及数组下标、循环边界、字符串切割,先写好条件判断再写核心逻辑。

5. 设计与场景题:从“高级计算器”看面向对象功力

网易这套卷子最后一题一般是设计题,热词里出现“java高级计算器”,我猜就是当年的原题之一或者很接近的变体。题目大概意思是:让你设计一个支持加减乘除、括号、甚至扩展到开方和幂运算的计算器,要求代码结构清晰、易于扩展。

这一题考察的不是算法,而是面向对象的设计能力。最差的写法是写一个大类,里面堆一堆 if-else 判断操作符,遇到加法走一个分支,遇到减法走另一个分支。这样写确实能跑,但扩展性很差,加一个新操作符就得改主类,违背了开闭原则。

比较好的设计是策略模式加运算符枚举。先把操作符抽象出来:

public interface Operator { double apply(double a, double b); int getPriority(); } public enum BuiltInOperator implements Operator { ADD("+", 1) { public double apply(double a, double b) { return a + b; } }, SUBTRACT("-", 1) { public double apply(double a, double b) { return a - b; } }, MULTIPLY("*", 2) { public double apply(double a, double b) { return a * b; } }, DIVIDE("/", 2) { public double apply(double a, double b) { if (b == 0) throw new IllegalArgumentException("除数不能为0"); return a / b; } }; // ... }

然后用一个Calculator类持有两个栈,一个操作数栈一个操作符栈,通过优先级判断是否弹栈计算。如果以后要支持幂运算,只要新增一个枚举常量,实现apply方法,设好优先级,主流程完全不用动。这就是策略模式的价值。

面试官看这类题的时候,脑子里会有一个判断:这人的代码是“能用就行”还是“可维护”的。如果你能在设计题里主动写出异常处理、参数校验、甚至注释,会非常加分。这比你把一道算法题刷三遍都管用,因为它反映的是工程素养。

另外还有一道和“计算器”类似的场景题是设计一个日志系统,要求支持不同的输出目标(控制台、文件、数据库),并且可以动态切换。这同样是在考察策略模式和工厂模式的组合——日志输出方式是一个策略,日志级别的过滤是一个职责链,只要你能把这两个模式说清楚,设计题基本就稳了。

6. 从这份卷子反推网易要的底层能力

6.1 校招笔试的隐藏评分标准

把整套卷子拆完,你会发现它其实只有四个考察维度:语言基础、底层原理、算法功底、工程素养。每个维度都有对应的题目,没有一个维度能被“背题”完全覆盖。选择题靠背能拿一部分分,但编程题和设计题必须真的会。

网易这种体量的公司,笔试系统每年会收到几万份答案,不可能人工每题看,很多是代码扫描加用例测试的方式在判分。这就意味着你的代码不光要逻辑对,还要能通过极端测试用例。数组为空、元素为负数、输入很大、需要long而不是int……这些边界条件都是判分点。我见过太多人算法思路全会,但一提交就挂,原因就是没有做空值校验或者只开了int范围。

6.2 除了刷题,你还要会看源码

如果你现在才开始准备Java面试,我的建议是别一头扎进刷题App里。先把Java基础过一遍,重点看集合类的源码——HashMap、ArrayList、LinkedList、ConcurrentHashMap,这些是笔试选择题的题库来源。再看JVM的内存模型和垃圾回收,不需要全部背下来,但堆/栈/方法区的区别、GC roots是什么、常见的收集器有哪些,都得能用自己的话讲出来。

然后是多线程。卷子里必考synchronizedReentrantLock的区别、volatile的可见性和禁止重排、线程池的核心参数。这些内容你用八股文背下来是能应付笔试,但到了面试官追问“你项目中哪儿用到线程池了”的时候就会露馅。所以不妨在复习的时候,拿一个简单场景亲手写一版线程池任务,感受一下核心线程数、队列容量、拒绝策略之间是怎么配合的。

6.3 环境配置的坑,其实也是考点

热词里反复出现“java安装”“java环境变量配置”“vscode运行java报错乱码”这类搜索,说明很多人卡在笔试之外的第一步。坦诚说,网易这种校招笔试用的是在线IDE,不会让你本地配环境,但环境变量和编译版本的问题会在面试后的入职环节疯狂纠缠你。而且现在不少公司的笔试要求你本地跑通再提交,如果你连JAVA_HOME都没配好,就等于还没上考场先丢一城。

Linux环境下写Java的话,优先用OpenJDK而不是Oracle JDK,公司里几乎都是前者。遇到UnsupportedClassVersionError就是编译版本和运行版本不一致,用java -versionjavac -version排查;遇到source release 17 requires target release 17就去IDE的编译器面板把两个版本号对齐。这些小知识看起来不起眼,但真到了宣讲会现场才发现没配好环境的人大有人在。

7. 给备考者的一套实操路线

结合这套卷子和这些年我带人的经验,我给你一条可以直接照做的学习路线,前提是你至少有一个月以上的准备时间。

第一阶段,用两周把Java基础过一遍。重点放在集合源码、异常分类、泛型、反射、IO、多线程这几个模块上。看书的时候别只看,每看完一个模块就做十道针对性的选择题,找到自己的知识盲区。这个阶段可以用《Java核心技术》这种经典的厚书,但跳着读就行,重点关注卷子常考的部分。

第二阶段,用一周刷算法。优先刷排序、链表、二叉树、动态规划四类。每道题自己先在本地写一遍,再对比题解,重点看别人的边界条件怎么处理的。LeetCode上easy和medium各刷30题就够应付校招笔试了,关键是按题意输出,别只讲思路不写代码。

第三阶段,用三天研究设计题。把策略模式、工厂模式、观察者模式、单例模式这几个最常用的设计模式吃透,每个都找一个实际场景写一小段代码。你可以尝试写一个简单计算器、一个日志框架、一个订单状态机,用这几个题目来检验自己的设计能力。

第四阶段,最后一天做整卷模拟。找一套完整的大厂Java笔试题,设定时间120分钟,全程不查资料,模拟真实笔试状态。做完之后不要只顾对答案,把错题对应的知识点整理成一个Excel表,哪类错得多,下一轮就重点看哪类。

这套路线是我自己当年备考的改进版,也是我建议身边每个人准备的逻辑。它和热词里那个“java面试八股文”最大的区别是,它不让你死记硬背,而是让你通过做题、看源码、写代码,把知识点变成肌肉记忆。

我个人的体会是,校招笔试真正拉开差距的往往不是谁刷的题多,而是谁的基本功更扎实。一份卷子发下来,选择题有人靠蒙也能蒙对六七成,但编程题和设计题写得好不好,一眼就能看出来。你把HashMap源码啃明白,把快速排序的partition写熟练,把设计模式在几个小项目里用顺手,到考场上你就不会慌。这份2018年的卷子放到今天,依然是最好的训练材料,万变不离其宗。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/1 18:56:27

AI购物智能体为何只能建议不能自动下单?技术拆解与Agent开发实践

“帮我在 300 元预算内选一款降噪耳机&#xff0c;性能优先&#xff0c;不要白色。”这是很多人在各类 AI 助手里问过的话。模型会在几秒钟内给你一串推荐&#xff0c;看起来有理有据&#xff0c;甚至还能附上购买链接。但当你想让它“直接下单”时&#xff0c;它往往停在最后一…

作者头像 李华
网站建设 2026/8/30 4:56:12

AI监督学习Agent实战:Token成本治理与角色化架构设计

做“AI监督我学习”这类项目时&#xff0c;开发者的技术判断点&#xff0c;往往不在“能不能接到大模型”&#xff0c;而在于“这段对话能不能长期跑下去&#xff0c;且token消耗不失控”。B站AI创造公开赛里有创作者用“AI德国军官监督我学习”作为项目主题&#xff0c;表面看…

作者头像 李华
网站建设 2026/9/1 21:36:43

用Python计算二十八星宿:确定性系统为何无法完全预测未来?

如果只看标题&#xff0c;这很像是一篇讲占星文化的内容。但放到技术语境里&#xff0c;它其实问了一个特别硬核的问题&#xff1a;一个系统如果是确定性的&#xff0c;那么它是不是一定能被算到底&#xff1f;本文把“二十八星宿”当作一个可计算的历法数据系统来拆解&#xf…

作者头像 李华
网站建设 2026/9/5 18:54:41

新手学习1

1.电源旁边的电容作用&#xff08;1&#xff09;滤波电容&#xff1a;通常由一个大容量电容和一个小容量电容并联大容量电容范围在10uF~100uF,通常为钽电容和电解电容小容量电容范围在0.01uF~0.1uF,通常为陶瓷电容作用&#xff1a;滤除电源杂波&#xff0c;减少外部干扰&#x…

作者头像 李华
网站建设 2026/9/1 23:17:24

用Python拆解《钟馗斩鬼传》:古典小说如何变成游戏化设定素材库

杨奇那句“新预告只是便饭”到底是不是在保底&#xff0c;我们这里不赌&#xff1b;真正值得琢磨的问题是&#xff1a;如果《黑神话&#xff1a;钟馗》真要落地成游戏&#xff0c;团队手里的第一手素材从哪里来&#xff1f;答案大概率绕不开清代神魔小说《钟馗斩鬼传》。这篇博…

作者头像 李华
网站建设 2026/9/2 0:00:45

Obsidian + AI 打造爆款案例库:从模板到自动化完整指南

这次我们来看一个结合 AI 和 Obsidian 搭建个人爆款案例库的方案。很多做内容创作、电商运营、短视频脚本、公众号写作的人都会有同一个问题&#xff1a;看了很多爆款内容&#xff0c;当时觉得有用&#xff0c;过几天就忘了&#xff0c;真要自己写的时候又找不到参考。 Obsidia…

作者头像 李华