ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

网易校招Java笔试题复盘:Java基础与面试高频考点详解

2026/8/30 6:24:17 拓冰建站 浏览量
网易校招Java笔试题复盘:Java基础与面试高频考点详解 说实话看到网易2018校园招聘Java工程师笔试卷这个标题的时候很多人的第一反应是“都是好几年前的题了还有啥好翻的”。但我自己的看法恰恰相反校招笔试和社招面试不一样它考察的东西非常固定翻来覆去就是Java基础、集合框架、JVM内存、常见算法、并发编程这几座大山。网易这套卷子称得上是一份非常典型的Java面试题样本里面涉及的知识点直到今天依然是面试八股文的高频考点也依然是很多人在实际开发中容易栽跟头的地方。这篇文章我想换个角度来写不单独放一份“参考答案”而是把这张卷子背后真正想考察的能力拆开讲清楚。每一类题目对应什么知识点、代码该怎么写、踩过的坑有哪些我会一并整理出来。无论你是准备Java面试的应届生还是刚入门想补基础的同学或者单纯想看看Java工程师笔试题长什么样的爱好者这篇文章都能给你一点实实在在的东西。1. 试卷总体印象与考核方向1.1 网易这套题到底在考什么很多初学者拿到一套Java笔试卷第一反应是赶紧去背题觉得把题目和答案背下来就万事大吉。但实际上像网易这样的大厂笔试题目只是载体真正考的是两样东西一是你对Java这门语言核心机制的理解深度二是你在限时条件下把思路转成代码的能力。从这套2018年的题目来看出题人并没有刻意刁难人。选择题部分基本围绕Java基础面试题展开比如面向对象编程Java的三大特性、标识符命名规则、运算符优先级、常见异常类型这些。这些内容看起来简单但恰恰是区分“背过八股文”和“真正理解”的分水岭。比如问你switch能不能传null、String用比较到底对不对、HashMap在JDK 1.7和1.8之间链表转红黑树的条件是什么这些都需要你对源码底层有一定了解光靠记忆很容易错。编程题部分则偏向算法和数据结构的落地冒泡排序Java实现、快速排序Java实现这类经典排序算法基本上是必出的。除了排序还会考察你对集合类的熟练程度比如用HashMap做词频统计、用ArrayList做数据去重、用Comparator定制排序规则等。说白了就是看你平时写代码的时候有没有真正把这些类用熟。1.2 试卷结构分析与时间分配一套完整的校招Java笔试卷通常由以下几个模块组成模块常见题型建议用时Java语言基础选择题、判断题15-20分钟集合框架与常用类选择题、填空题10-15分钟JVM与内存选择题、简答题10-15分钟算法与手写代码编程题30-40分钟数据库/网络/并发选择题、简答题15-20分钟这里我给出的时间分配是比较理想化的。实际考试中很多同学会卡在手写算法题上一写就是四五十分钟导致后面的简答题没时间做非常吃亏。我的建议是发下试卷后先把所有题目快速扫一遍标记出哪些是稳拿分的基础题哪些是需要思考的难题。先做基础题确保正确率再集中精力攻克编程题。不要在一道选择题上纠结超过三分钟更不要因为一道题打乱了整体节奏。这套策略看起来简单但考场上的心态差距往往就在这里拉开。2. 语言基础与面向对象最不值得丢分的部分2.1 标识符、运算符、表达式这些“送分题”怎么稳拿Java标识符命名规则是笔试选择题里的常客。很多同学觉得这也太基础了不值得复习结果一考就错。其实规则本身并不复杂标识符只能由字母、数字、下划线和美元符号组成不能以数字开头不能是Java关键字并且严格区分大小写。真正容易出错的是那些特殊的合法写法比如$name是合法的、_id是合法的但123abc、class、my-name都不合法。另一个高频考点是运算符和表达式。这里有个经验可以分享凡是碰到括号嵌套特别多、位运算和逻辑运算混在一起的题目先在草稿纸上把运算符优先级写出来再逐步代入计算。Java中赋值运算符优先级极低几乎只高于三元运算符而自增自减运算符优先级很高所以在表达式里看到i i这种组合一定要一个变量一个变量推不要想当然。这套题里如果出现了类似选项考察的就是你能否耐下心来做推导。2.2 面向对象编程Java重载、重写、继承、多态面向对象编程Java是校招笔试的重头戏也是八股文里出现频率最高的板块之一。重载和重写的区别、继承时构造方法的调用顺序、多态的动态绑定机制这三个点几乎是必考。我强烈建议你把它们整理成一张对比表反复看直到闭上眼睛能默写出来为止。对比项重载重写发生的类同一个类中父子类之间方法名相同相同参数列表必须不同必须相同返回类型可以不同必须相同或为其子类型访问修饰符不限不能比父类更严格抛出异常不限不能抛出比父类更宽泛的异常这里有个容易踩坑的点如果在重写父类方法时不加Override注解编译器不会报错只是会把它当成一个新方法处理这样多态就失效了。所以平时写代码一定要养成加Override的习惯这也是代码规范里经常强调的一点。至于多态笔试里最常见的考法是给出一个继承体系比如父类引用指向子类对象然后问你调用某个方法时输出什么。这种题的关键在于理解“编译看左边运行看右边”。变量类型决定了你能调用哪些方法而实际执行哪个方法版本取决于对象的真实类型。这个机制搞清楚了几乎所有多态选择题都能迎刃而解。2.3 枚举类型的使用从常量到单例模式Java枚举类型在笔试中出现的频率不如集合框架那么高但一旦出现很容易拉开差距。枚举的底层实现是一个继承了java.lang.Enum的final类每个枚举常量都是该类的一个静态final实例。这意味着枚举天生就是线程安全的而且可以用于switch语句、实现接口、定义抽象方法。实际开发中我比较推荐用枚举来管理状态码。比如说定义一个ResultCode枚举包含SUCCESS(200,成功)、FAIL(500,失败)这样的常量再给枚举加上code和message字段以及构造方法。这样一来业务代码里就不用到处写魔法数字了维护起来也方便得多。笔试中如果让你手写枚举记得把构造方法、字段、getter方法都补齐并且在枚举常量后面加分号这是初学者最容易漏掉的语法细节。还有一个经典考点是“枚举实现单例”。相比双重检查锁和静态内部类枚举单例写法最简洁而且能天然防止反射攻击和序列化破坏。虽然校招笔试不一定会让你写但面试官问到单例模式时你能主动说出枚举这个方案绝对是加分项。3. 集合框架容器类题目几乎每年必考3.1 HashMap、ArrayList、LinkedList的底层原理与对比Java容器是笔试中考查密度最高的一个模块没有之一。HashMap的底层原理更是Java面试题里的“必考题”。在JDK 1.8中HashMap底层是数组加链表加红黑树的结构当链表长度超过8且数组长度大于等于64时链表才会转成红黑树。很多同学只记住了“链表长度超过8转红黑树”却忽略了“数组长度大于等于64”这个前置条件这个细节在选择题里就是明显的失分点。ArrayList和LinkedList的对比也是老生常谈。ArrayList底层是动态数组查询快、增删慢LinkedList底层是双向链表增删快、查询慢。但要注意这个“快”和“慢”都是相对的。如果你在ArrayList的尾部不断add元素它的效率并不低因为扩容机制保证了均摊时间复杂度接近O(1)。反过来如果你要在LinkedList的指定位置插入元素仍然需要先遍历到该位置时间复杂度依然是O(n)。所以笔试选择题里如果简单粗暴地说“LinkedList增删快ArrayList增删慢”一定要留个心眼。3.2 Comparator与Comparable排序规则如何定制集合排序这一块Comparable和Comparator是两个绕不开的接口。Comparable是内部比较器实现了它的类可以调用Collections.sort()直接排序Comparator是外部比较器可以在不修改原类的情况下通过匿名内部类或Lambda表达式定制排序规则。举个例子假设你有一个Person对象包含name和age两个字段。如果你想让一组人按年龄从大到小排序可以写成ListPerson list new ArrayList(); list.sort((p1, p2) - p2.getAge() - p1.getAge());但这里有个隐患如果getAge()返回的是Integer对象直接用p2.getAge() - p1.getAge()会出现拆箱而如果年龄差值超过int范围就会溢出。更稳妥的是写成list.sort(Comparator.comparing(Person::getAge).reversed());如果我需要把某个特定的人排在最前面比如把姓“张”的人放到第一位再按年龄排序可以用Comparator的组合写法ComparatorPerson byZhangFirst (p1, p2) - { if (张.equals(p1.getName().substring(0, 1))) return -1; if (张.equals(p2.getName().substring(0, 1))) return 1; return p2.getAge() - p1.getAge(); };笔试中如果遇到类似的排序定制题优先想到用Comparator.comparing加链式调用代码既简洁又不容易出错。3.3 数组越界与并发修改异常Java中数组越界异常是入门阶段最常见的错误之一对应异常类型是ArrayIndexOutOfBoundsException。它的本质是访问了数组中不存在的索引位置。比如说数组长度为5合法索引是0到4访问arr[5]就会抛这个异常。笔试中经常会考到循环边界的问题比如for (int i 0; i arr.length; i)这明显就是多循环了一次必然越界。正确的写法是i arr.length。另一个容易被忽略的是ConcurrentModificationException它在使用增强for循环遍历ArrayList时删除元素会触发。原因是ArrayList内部维护了modCount修改计数器而迭代器在创建时会记录这个值遍历过程中如果检测到modCount发生变化就会抛出该异常。解决办法是使用Iterator的remove()方法或者用JDK 8的removeIf。笔试中如果遇到“遍历集合时安全删除元素”的题目这个点必须写清楚。4. JVM内存模型与OutOfMemoryError排查4.1 JVM运行时数据区域划分JVM相关的题目在网易这套笔试卷中占据一定比重而且也是Java面试八股文里的核心章节。JVM运行时数据区可以划分为程序计数器、虚拟机栈、本地方法栈、堆和方法区。其中堆是对象分配内存的主要区域也是垃圾回收的重点区域虚拟机栈用来存放栈帧每个方法调用都会对应一个栈帧。笔试中常见的考法是给你一段代码问某个对象分配在哪个区域。绝大多数情况下通过new创建的对象和数组都分配在堆中局部变量和方法参数则存放在虚拟机栈的栈帧中。但要注意栈中存放的只是引用变量本身引用指向的对象仍然在堆中。这个区分是很多题目的定点考查内容也是面试官判断你有没有真正理解内存模型的关键。4.2 Java: OutOfMemoryError: Insufficient memory 的常见场景最近在热搜词里看到“java: outofmemoryerror: insufficient memory”这个报错在校招笔试和日常工作里都经常碰到。严格来说OutOfMemoryError是一个错误而不是异常它表示JVM内存已经不足以继续运行程序。常见场景有三类堆内存不足、方法区/元空间不足、线程栈内存不足。堆内存不足通常表现为创建了太多大对象或者存在内存泄漏导致对象无法被回收元空间不足多发生在加载大量动态生成的类时线程栈不足则常见于无限递归或者创建了过多线程的场景。报错信息可能原因排查方向java.lang.OutOfMemoryError: Java heap space堆内存不足检查是否有对象泄漏、加大堆内存java.lang.OutOfMemoryError: Insufficient memory内存分配失败查看系统可用内存、JVM参数设置java.lang.StackOverflowError栈溢出检查递归是否缺少终止条件笔试不一定会让你现场排查但很可能会问你“如何定位内存溢出问题”。这时候如果你能说出用jmap -heap pid查看堆内存使用情况、用jstat监控GC频率、用MAT分析堆转储文件面试官就会觉得你是真正干过活的。4.3 排查手段jmap、jstat、MAT排查JVM内存问题是有标准步骤的。第一步是拿到Java进程的PID可以用jps -l命令查看。第二步用jmap -heap pid查看堆内存配置和使用情况如果老年代占用持续高位说明可能存在内存泄漏。第三步用jstat -gcutil pid 1000每秒输出一次GC统计信息观察Full GC是否频繁触发。第四步在发生OOM的时候加上-XX:HeapDumpOnOutOfMemoryError参数让JVM在内存溢出时自动生成堆转储文件然后用MAT打开分析。这里特别提醒一下如果笔试题里给出了报错信息千万不要只答“加大-Xmx参数”。这个思路在压力测试和临时处理时有用但真正要解决内存溢出问题核心是找到谁占用了内存、为什么没被回收。加内存只是治标不治本这是面试官很看重的一个认知。5. 手写算法冒泡排序与快速排序的Java实现5.1 冒泡排序的写法与优化排序算法是校招笔试编程题的常客冒泡排序Java实现基本是每个Java程序员最早接触的排序算法。它的核心思想是相邻元素两两比较较大的元素逐渐“冒泡”到数组末尾。最基础的写法如下public static void bubbleSort(int[] arr) { int n arr.length; for (int i 0; i n - 1; i) { for (int j 0; j n - 1 - i; j) { if (arr[j] arr[j 1]) { int temp arr[j]; arr[j] arr[j 1]; arr[j 1] temp; } } } }这个写法的时间复杂度是O(n^2)面试时如果只写出这一版只能算及格。真正能体现你思考深度的是对冒泡排序做优化。如果某一轮循环过程中没有发生任何交换说明数组已经有序此时可以直接跳出循环。这个优化可以让最好情况下的时间复杂度降到O(n)。public static void bubbleSortOptimized(int[] arr) { int n arr.length; for (int i 0; i n - 1; i) { boolean swapped false; for (int j 0; j n - 1 - i; j) { if (arr[j] arr[j 1]) { int temp arr[j]; arr[j] arr[j 1]; arr[j 1] temp; swapped true; } } if (!swapped) { break; } } }笔试建议写优化版本代码量只多了三行但能体现你对算法细节的敏感度。5.2 快速排序的写法与性能分析快速排序Java实现在笔试中出现的频率也很高因为它体现了分治思想也是实际工程中应用最广泛的排序算法之一。核心思路是选取一个基准元素将数组划分为小于基准和大于基准的两部分然后递归地对这两部分排序。public static void quickSort(int[] arr, int left, int right) { if (left right) { return; } int pivot partition(arr, left, right); quickSort(arr, left, pivot - 1); quickSort(arr, pivot 1, right); } public static int partition(int[] arr, int left, int right) { int pivot arr[right]; int i left; for (int j left; j right; j) { if (arr[j] pivot) { swap(arr, i, j); i; } } swap(arr, i, right); return i; } public static void swap(int[] arr, int i, int j) { int temp arr[i]; arr[i] arr[j]; arr[j] temp; }上面这个写法采用的是“挖坑法”的变体以最右侧元素为基准用i记录小于基准区的边界。快速排序的平均时间复杂度是O(n log n)但最坏情况下会退化到O(n^2)。最坏情况发生在每次选取的基准都是当前区间最大或最小值时比如对一个已经有序的数组如果每次都以最后一个元素为基准递归深度就会变成n性能急剧下降。为了规避这个问题可以在选取基准时引入随机化比如随机选一个索引和最后一个元素交换然后再做分区。这个优化在笔试中未必要求但如果你能在代码注释里提一句“随机化基准可以避免最坏情况”绝对能加分。5.3 笔试中如何快速写出正确且易于理解的排序代码手写排序算法时很多同学的毛病是追求一步到位结果越写越乱。我的建议是先写出语义清晰的版本再考虑优化。笔试判卷通常不在乎你的代码是O(n log n)还是O(n^2)在乎的是逻辑是否正确、边界是否处理清楚、代码可读性是否高。实际写代码时有几个细节一定要留意。第一循环边界不要写错数组长度是n最后一轮循环是n - 1而不是n。第二left right这个递归退出条件必须放在递归函数最前面否则会无限递归导致栈溢出。第三partition函数返回的基准位置在递归时不要包含它本身否则会死循环。这些小问题恰恰是笔试中最容易丢分的地方。如果有机会在IDE或者在线编辑器里写写完一定要自己用几个测试用例跑一遍比如空数组、单个元素、两个元素、升序数组、降序数组、含重复元素的数组。这些边界用例能帮你发现绝大部分隐藏bug。6. Java 8特性Lambda、函数式与Stream6.1 Lambda函数Java语法与本质Java 8引入的Lambda表达式是校招笔试中比较新的考点也是Java面试题里的热门话题。热词里频繁出现“lambda函数 java”说明很多同学对这个知识点既熟悉又陌生。熟悉的是它的箭头语法-陌生的是它背后的函数式接口概念。Lambda表达式的本质是一个函数式接口的匿名实现。所谓函数式接口就是只包含一个抽象方法的接口比如Runnable、Comparator、Consumer。Lambda表达式可以看成是简化版的匿名内部类// 匿名内部类写法 Runnable r1 new Runnable() { Override public void run() { System.out.println(hello); } }; // Lambda写法 Runnable r2 () - System.out.println(hello);笔试中如果遇到判断题让你判断某个接口是不是函数式接口关键就看它是不是只有一个抽象方法。如果接口里有equals、hashCode这些Object类的方法不算抽象方法因为接口里声明的Object方法有具体实现不会破坏“只有一个抽象方法”的规则。6.2 Stream与集合操作的转换Stream API是Lambda表达式的最佳实践场景也是Java基础面试题中越来越常见的考察点。它的核心思想是用声明式的方式处理集合数据把“怎么做”交给库把“做什么”写在代码里。举个笔试题里经常出现的例子给定一个整数列表筛选出所有偶数对每个数求平方然后按从大到小排序最后输出前三个。用传统for循环写可能要好几行用Stream写就是一行ListInteger numbers Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8); ListInteger result numbers.stream() .filter(n - n % 2 0) .map(n - n * n) .sorted(Comparator.reverseOrder()) .limit(3) .collect(Collectors.toList());这套链式调用分为中间操作和终端操作。filter、map、sorted都是中间操作它们不会立即执行只有在遇到collect这样的终端操作时才会触发整个流水线的计算。这个惰性求值的机制如果理解了很多Stream相关的理解题都不会错。6.3 实际工程中如何用Lambda写代码笔试结束后如果你进入实际开发Lambda和Stream的优势会更明显。它能让代码更简洁、更专注业务逻辑。不过我建议你在追求简洁的同时不要牺牲可读性。如果一个比较复杂的逻辑硬要用Stream强行一行写完同事维护起来会很痛苦这样的代码反而不如传统的for循环清晰。我个人的习惯是超过三步的Stream链式调用拆成多个步骤并用有意义的变量名保存中间结果。比如先筛选、再转换、最后聚合分别赋值给evenList、squaredList、result这样每一步都清清楚楚出了问题也好排查。笔试里如果你能用Stream写出正确答案再加一个注释说明逻辑判卷观感会好很多。7. 环境与工具链笔试前先把Java环境搞定7.1 JDK安装与环境变量配置别看这个标题简单实际上每次笔试前或者参加工作后的第一次环境搭建都有人卡在JDK安装和环境变量配置上。热词里“java环境变量配置详细教程”和“java环境变量配置”同时上榜说明这真的是个高频痛点。JDK安装步骤如下先去官网下载对应平台的JDK安装包。安装时记住安装路径。配置环境变量时需要设置三个关键项JAVA_HOME指向JDK安装目录PATH中新增%JAVA_HOME%\binCLASSPATH设置为.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar。这里特别提醒CLASSPATH开头的.不能省略它代表当前目录否则运行Java程序时可能找不到类。配置完成后打开命令行输入java -version如果能看到版本信息说明配置成功。这一步验证非常重要很多同学配置完直接运行程序结果报了找不到命令的错误其实只是忘了重新打开命令行窗口环境变量没有立即生效。7.2 常见报错处理vscode运行Java报错乱码VS Code运行Java报错乱码是热词里另一个高频问题。这个问题的根源通常在于编码不一致。Java源文件默认使用UTF-8编码保存而Windows系统默认的字符集是GBK如果编辑器和命令行控制台的编码设置不一致就会出现中文乱码。解决办法有两个方向。一个是统一源文件编码在settings.json中设置java.debug.settings.consoleEncoding: GBK, terminal.integrated.defaultProfile.windows: Command Prompt另一个方向是统一控制台编码运行Java程序时在JVM参数中加上-Dfile.encodingUTF-8或者在系统环境变量中设置JAVA_TOOL_OPTIONS-Dfile.encodingUTF-8。我本人更推荐第二种因为它在所有Java程序中全局生效不用每次手动加参数。7.3 源发行版/目标发行版报错与Lombok问题除了乱码还有几个常见的编译报错需要提前了解。一个是“java: 警告: 源发行版 17 需要目标发行版 17”这个报错的意思是你项目里的源码使用Java 17语法编译但IDE或Maven配置的目标发行版不匹配。解决办法是在pom.xml中明确指定maven.compiler.source和maven.compiler.target为一致版本或者安装与项目匹配的JDK。另一个是热搜里的“java: you arent using a compiler supported by lombok, so lombok will not wo”。这个报错通常出现在Lombok版本和JDK版本不匹配的场景。解决办法是升级Lombok到最新版本或者降低JDK版本。出现这个报错时代码里所有的Data、Getter、Setter注解都会失效表现为明明写了getter方法却找不到。这类问题在笔试前如果没处理好会浪费大量时间。8. 常见问题与排查技巧实录8.1 Lombok报错you arent using a compiler supported by lombok这个报错的实际场景是这样的你本地安装的是JDK 17但项目依赖的Lombok版本还停留在旧的1.16.x。Lombok是通过注解处理器在编译期修改AST抽象语法树来生成代码的它必须适配当前JDK版本的编译器内部接口。JDK升级后Lombok如果没有及时更新就会报出“不支持的编译器”错误。解决办法很直接到Maven中央仓库查一下当前Lombok的最新版本把pom.xml中的版本号升级上去。如果你用的是IDEA或VS Code升级依赖后需要重新导入项目并且清一下本地Maven缓存。如果实在不想升级Lombok也可以手动把缺失的getter、setter代码写出来但这对大型项目来说不现实。这里分享一个我的经验平时给你的项目配一个Maven依赖版本管理清单哪个依赖升级到哪个版本、为什么升级都记录下来。这样遇到问题的时候回溯起来非常快不用靠记忆去猜。8.2 mapping processor NullPointerException热搜里有一条是“java: internal error in the mapping processor: java.lang.nullpointerexceptio”这个报错一般出现在使用了MapStruct这类映射框架的项目中。MapStruct会在编译期根据注解生成Mapper实现类如果遇到NullPointerException八成是源码中被映射对象的字段缺失或者类型不匹配。排查这个问题的基本思路是找到报错对应的源文件检查Mapper接口里定义的映射方法看它映射的两个对象之间是否存在相同名称但类型不一致的字段。比如源对象有个Date createTime目标对象却定义为String createTimeMapStruct默认不会做这种类型转换就会在生成映射代码时出错。添加一个自定义的Mapping表达式或者typeExpression来解决。不过这类问题在校招笔试中不太会出现更多是实战开发中的坑。8.3 列一个高频报错速查表为了让大家复习时一眼就能抓住重点我把上面提到的几个经典报错整理成一个速查表方便笔试前快速过一遍报错信息核心原因解决方向java.lang.ArrayIndexOutOfBoundsException数组索引越界检查循环边界应该是而非java.util.ConcurrentModificationException遍历集合时修改结构使用迭代器remove或removeIfjava.lang.StackOverflowError递归无终止条件检查递归退出条件java.lang.OutOfMemoryError: Java heap space堆内存不足排查对象引用合理设置-Xmxjava: 源发行版 17 需要目标发行版 17编译版本不一致统一source和target版本lombok doesnt support compilerJDK与Lombok版本不匹配升级Lombok依赖vscode中Java输出乱码控制台与文件编码不一致统一UTF-8或调整控制台编码这里加一句除了看报错信息本身一定要看完整堆栈。堆栈的第一行往往只是现象真正的原因藏在往下几行的Caused by里。这个习惯从刷题阶段就要养成以后排查线上问题能省很多时间。9. 备考建议与个人经验9.1 如何围绕Java八股文做系统化复习Java面试题中大量的基础概念被统称为“八股文”很多人对这个词有偏见觉得学了也没用。但以我招人和被招的体会来看八股文的背后其实是语言基础知识的体系化梳理关键看你怎么学。我比较推荐的复习方式是按主题建立思维导图把Java基础面试题拆成几个大块面向对象、集合框架、JVM、并发、IO、Java 8新特性。每个大块再拆成若干个小点每个小点用一两句话概括核心结论并配一个代码示例。比如说“HashMap在JDK 8中链表转红黑树的条件”这个点记下“链表长度8且数组长度64”再配合一个简单的示意图基本就不会忘了。9.2 刷题之外还要准备什么笔试只是第一关通过了还有面试。我建议你在复习笔试内容的同时尤其要注意积累项目经验。很多校招简历上写的项目都是“秒杀系统”“博客系统”这种教程项目面试官一眼就能看出来。你当然可以写这类项目积累经验但一定要能说清楚里面的技术难点和解决方案。比如你说自己用到了Redis缓存那就要知道缓存穿透、缓存击穿、缓存雪崩分别怎么解决你说项目用了消息队列那就要知道如何保证消息不丢失、不重复消费。这些问题的核心还是Java基础是否扎实。另外动手实践比看题更重要。笔试前找几套真题限时两个小时做一遍严格按照考试环境模拟。做完后不要只看对错要把每一道错题对应的知识点重新回顾一遍找到自己为什么会错。这个复盘的过程比盲目刷十套题都有效。最后再分享一个小技巧笔试中如果遇到不会的编程题千万不要空白。把思路用注释写在代码里把能想到的类名和变量名写出来哪怕只实现了一半也有可能得到步骤分。面试官想看到的不是完美的答案而是你在面对未知问题时如何思考和分解问题。这个能力才是笔试真正想考察的东西。我在实际带人的过程中也发现凡是能静下心把基础题稳稳拿满的候选人入职后的代码质量往往也更高。希望这份关于网易2018校园招聘Java工程师笔试卷的复盘能帮你在准备Java面试的路上少走一些弯路。