ARTICLE DETAIL

资讯详情

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

网易Java实习生笔试考点全解析:从基础语法到JVM与集合框架

网易Java实习生笔试考点全解析:从基础语法到JVM与集合框架 网易2018实习生招聘的Java开发笔试题放在今天回头看依然是一份很有参考价值的“Java基础能力体检表”。很多同学私信问我当时是怎么准备的其实那套题并不偏、也不怪考的就是你平日里写代码时有没有真正去弄懂那些最常用的类和语法背后的原理。这篇文章我会把网易这套笔试题涉及的核心考点拆开揉碎结合我后来面试别人和带实习生的经验把该补的基础、该避的坑、该刷的题一次性讲清楚。不管你是准备大厂实习还是刚学完Java想检验一下自己的水平这篇内容都能帮你少走不少弯路。1. 笔试题整体风格与出题逻辑1.1 网易实习生笔试到底在考什么先给没参加过的人还原一下场景网易的实习生招聘笔试一般是线上统一进行JAVA开发岗位的试卷结构通常由“单选题 多选题 编程题”构成。单题分值不高但覆盖面非常广从Java语法细节到JVM内存模型从集合框架源码到并发编程基础都会涉及。编程题一般是两到三道难度梯度明显第一道热身最后一道压轴。我当时拿到试卷的第一感受是题不难但很“黏”。什么叫黏就是每一道选择题你都会觉得“我好像见过”但选项里总有一两个模棱两可的表述让你纠结。比如给你一段代码问你输出什么四个选项看起来都对其实考的是字符串常量池、自动装箱缓存或者整数除法截断这种特别细的点。这种考法其实是网易的典型风格——它不指望你背多少八股文而是看你在日常写代码时有没有对每个基础行为建立准确的直觉。还有一个很多人忽略的点网易笔试题里经常会出现“选错误的选项”这种反向设问。做这种题千万要先看清题目要求我见过太多人在“下列说法错误的是”这道题上栽跟头因为习惯性地去找正确选项了。1.2 为什么说这套题到现在仍有参考价值有人可能会说2018年的题现在新技术都换了好几轮了还有必要看吗这个想法可以理解但放在Java这个领域其实不太成立。Java这个语言有个特点它的核心语法和基础类库保持了极高的向后兼容性。你在2018年写的ArrayList代码放到最新的JDK 17、JDK 21上依然能跑运行逻辑也几乎没有变化。Java的技术栈确实在更新——模块化、虚拟线程、新的垃圾回收器都在演进——但大厂实习生招聘考的核心恰恰是那些最稳定、最基础的东西。因为面试官心里清楚实习生入职后不可能马上接触什么高深的架构绝大多数时间就是在写业务代码、CRUD、修Bug这时候最需要的就是对Java基础有扎实的理解。所以你会发现无论题目怎么变HashMap的原理、String的不变性、线程的生命周期、IO流的分类这些点年年考、家家考。认真吃透这套2018年的题目你再去做其他大厂的真题会感觉很多知识点是重叠的。这也是我为什么愿意花时间写这篇文章的原因——它本质上是一份“Java基础考点地图”跟着地图走不会迷路。2. 核心考点Java基础语法与面向对象思想2.1 数据类型、运算符与表达式这一块最容易丢分网易的单选题很爱考基础数据类型的细节。比如byte、short、int、long的隐式类型转换规则float和double的精度问题char与int之间的运算结果类型以及位运算符的优先级。很多人写业务代码时习惯了IDE自动提醒很少关心这些底层规则但笔试恰恰会精准命中最容易被忽视的角落。我这里举一个非常典型的例子byte b1 1; byte b2 2; byte b3 b1 b2; // 编译报错为什么原因是两个byte做加法时编译器会把它们都提升为int再运算所以结果是int类型给byte赋值必须显式强转。这是JLS规定的二元数值提升规则不是IDE抽风。再比如自增运算符的区别i和i在表达式中的求值顺序。这些考点看似简单但很多人一放到复杂的多表达式嵌套里就会懵。我的建议是遇到这类题不要凭感觉在草稿纸上老老实实拆解每一步的中间结果。笔试虽然有时间压力但这类题拆开写也就20秒比瞎猜稳得多。2.2 面向对象三大特性封装、继承、多态的底层逻辑Java最核心的面向对象考点无外乎封装、继承、多态。但网易的题目不会直接问“什么是多态”而是给你一段涉及方法重写、重载、父子类初始化的代码让你预测输出。我记得当年有一道印象很深的题是关于类的加载顺序的。它可以变形出无数种考法但万变不离其宗父类静态代码块 → 子类静态代码块 → 父类实例代码块 → 父类构造方法 → 子类实例代码块 → 子类构造方法。如果你能把这个顺序当成“常识”而不是“背诵”代码考察题基本不会失分。另一个高频考点是接口和抽象类的区别。这里有个更深层的理解角度抽象类是对“类”的抽象它描述的是“是什么”的关系强调的是代码复用接口是对“行为”的抽象它描述的是“能做什么”的关系强调的是能力扩展。Java 8之后接口里有了default方法和static方法这个区别的边界在笔试题里也经常被试探需要特别注意。2.3 字符串、包装类与枚举考的都是平时不注意的小细节字符串是Java笔试的“题库重灾区”String、StringBuilder、StringBuffer三者的区别字符串常量池与堆内存的区别字符串拼接的性能问题这些都是送分题但细节题很容易丢分。举个例子String s1 hello; String s2 hello; System.out.println(s1 s2); // true都是常量池中的同一对象 String s3 new String(hello); System.out.println(s1 s3); // falses3是堆中新建的对象 String s4 s3.intern(); System.out.println(s1 s4); // trueintern()返回常量池中的引用这个知识点要是理解不到位很容易在这里失分。我在面试别人的时候也喜欢问这个点因为通过这个题就能看出一个人对JVM内存结构的理解深度。包装类的考点集中在自动装箱与自动拆箱。尤其要记住Integer在 -128 到 127 范围内有缓存所以Integer a 127; Integer b 127; a b的结果是 true但如果两个值都超出这个范围结果就是 false。很多人在这个细节上栽过跟头。枚举类型在笔试中也经常“客串”出现。网易的题常会给出一个带构造方法、带成员变量的枚举然后问你枚举的构造函数什么时候被调用。答案是枚举的构造方法在类加载时就执行且是私有的每个枚举常量都会调用一次构造方法而且是在静态代码块之前还是之后这里要仔细看字节码顺序。我工作中确实见过有人在switch里大量用枚举但问起原理并不能说得很清楚。3. 核心考点JVM、集合框架与并发编程3.1 JVM内存模型与OutOfMemoryError热搜词里出现的java: outofmemoryerror: insufficient memory是实际开发中常见的报错而笔试中对JVM的考察通常聚焦于运行时数据区域、垃圾回收算法、内存溢出场景。记住这张表的考点就够了运行时数据区域存储内容常见异常程序计数器当前线程执行的字节码行号指示器无虚拟机栈局部变量表、操作数栈、方法返回地址StackOverflowError本地方法栈为native方法服务StackOverflowErrorJava堆对象实例、数组OutOfMemoryError: Java heap space方法区/元空间类信息、常量、静态变量OutOfMemoryError: MetaspaceJDK 8及以后网易的题目喜欢给一段代码让你判断它会抛出哪种异常。比如递归没有终止条件答案是StackOverflowError一次性new大量对象不停塞进List答案是OutOfMemoryError。这类题不难但你要能准确说出每个区域的名称以及常见的异常对应关系。至于垃圾回收重点理解可达性分析算法、GC Roots有哪些、以及常见的收集器。实习生岗不会考太深但“哪些对象可以作为GC Roots”这种概念题出现过很多次。3.2 HashMap、ArrayList等集合框架的源码级考点集合框架是Java笔试的“大题高产区”尤其是HashMap。原因很简单它的实现跨越了数据结构、哈希算法、并发安全等多个层面面试官只要问一个HashMap就能快速判断候选人基础扎不扎实。2018年这个时间点JDK 8已经是主流所以HashMap的考点集中在底层结构数组 链表 红黑树链表长度 ≥ 8 且数组长度 ≥ 64 时转为红黑树扩容机制默认容量 16、加载因子 0.75扩容时 size 变为原来的两倍哈希方法(h key.hashCode()) ^ (h 16)高位异或降低哈希冲突为什么链表转红黑树的阈值是8因为泊松分布当负载因子0.75时链表长度到8的概率已经极低此时用红黑树替代是性能权衡的结果注JDK 8及以上版本中HashMap处理哈希冲突时先在链表中追加尾插法而JDK 7用的是头插法在并发扩容时会产生循环链表导致死循环。这个区别如果题目里明确写了支持的JDK版本需要特别注意。ArrayList的考点在于初始容量是10每次扩容为原来的1.5倍新容量 旧容量 旧容量 1底层是Object数组。LinkedList则是双向链表实现了Deque接口。二者对比常常出多选题。Vector和Hashtable这类同步容器也是传统考点考察它和ArrayList、HashMap的区别。3.3 并发与线程从基础概念到代码输出题并发这一块网易笔试喜欢考的是synchronized关键字、volatile关键字、线程的状态转换、以及简单的多线程程序输出结果。synchronized考的偏底层它锁的是什么在实例方法上锁的是当前实例对象在静态方法上锁的是类对象在同步代码块中锁的是括号里指定的对象。volatile考的是可见性和有序性但要注意它不能保证原子性。线程状态是一个高频图新建New、就绪Runnable、运行Running、阻塞Blocked、等待Waiting、超时等待Timed Waiting、终止Terminated。注意调用start()之后线程进入Runnable状态而不是立刻Running。这个点经常设置文字陷阱。如果编程题里出了多线程基本都是让你用Thread或ExecutorService实现某个简单的并发场景比如交替打印数字、生产者消费者。这种题建议提前准备固定模板不要现场临时写。生产者和消费者模型用BlockingQueue能写出很简洁的解法BlockingQueueInteger queue new ArrayBlockingQueue(10); // 生产者 new Thread(() - { for (int i 0; i 100; i) { try { queue.put(i); System.out.println(生产: i); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } }).start(); // 消费者 new Thread(() - { while (true) { try { System.out.println(消费: queue.take()); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } }).start();多线程输出类题目一般只需要判断结果是否为确定值、是否会死锁不要求精确预测每个字符。4. 核心考点网络、IO与框架基础4.1 TCP/IP与HTTPJava面试绕不开的基础虽然没有明确说网易考了多少网络题但从各互联网大厂的通用出题思路来看JAVA开发实习生笔试题里通常有3-5道网络基础题。重点包括TCP三次握手与四次挥手的过程与状态CLOSE_WAIT、TIME_WAIT、TCP与UDP的区别、HTTP的请求方法、常见状态码的含义。特别是状态码。302和307的区别301和302的区别404和410的区别这些细节都可能成为单选题的考点。另外HTTPS的握手过程对称加密与非对称加密在HTTPS中分别用在哪个环节也是很多公司的常客。这里记住一个核心结论就好非对称加密握手、对称加密传输用非对称加密协商出会话密钥之后用会话密钥进行对称加密通信性能开销更小。4.2 IO与NIO从单线程到多路复用Java IO这一块网易笔试比较喜欢考三个层次一是基本IO流体系字节流和字符流的区分InputStream/OutputStream与Reader/Writer的对应关系二是IO与NIO的区别NIO的三大核心组件Buffer、Channel、Selector三是BIO、NIO、AIO模型的概念辨析。BIO是阻塞IO一个连接一个线程适合连接数少的场景NIO是同步非阻塞IO基于多路复用器Selector一个线程可以处理多个连接AIO是异步非阻塞IO由操作系统完成后回调通知。在实际的框架中Netty就是基于NIO实现的。这个知识链条能串起来笔试答网络IO题基本够用。4.3 Spring框架基础程序员的基本盘2018年的笔试题中Spring相关的内容已经开始出现但占比不高主要集中在什么是IoC和DI、AOP的典型应用、Bean的生命周期。对实习生来说把下面这个Bean生命周期说清楚已经很能加分了实例化 - 属性填充 - 设置BeanName - 执行BeanPostProcessor的Before方法 - 初始化方法PostConstruct、InitializingBean、自定义init-method- 执行BeanPostProcessor的After方法 - 使用 - 销毁PreDestroy、DisposableBean、自定义destroy-method这个考点之所以常考是因为它最能体现你平时使用SpringBoot时有没有想过“自动配置和自动装配到底是怎么发生的”。如果只是会写Autowired而不理解背后发生了什么那在追问之下就会暴露短板。4.4 环境配置与编译问题新手必踩的坑热搜词里出现了很多和环境配置相关的报错比如源发行版17需要目标发行版17、Lombok版本不兼容等问题。这些虽然不是网易笔试的直接考点但跟Java开发者日常密切相关在面试的实操环节比如让你现场写代码并运行会突然变成致命的绊脚石。“源发行版 17 需要目标发行版 17”这个报错本质是项目配置和JDK版本不对齐。通常发生在你本地装了高版本JDK但IDE或Maven的编译版本还停留在旧版本。解决办法是统一pom.xml中的maven.compiler.source、maven.compiler.target和java.version。这个细节看似不起眼但我见过太多实习生在入职第一天就被卡在这里半小时。Lombok的报错“you arent using a compiler supported by lombok”通常是IDE内置编译器和Lombok版本不兼容优先考虑升级Lombok到与JDK匹配的最新版本同时确保IDE的Annotation Processing已启用。有时候Workstation管理员权限不足也会导致Lombok无法正常运行。环境配置这一块建议在学习阶段就一次搞定别都堆到笔试前夜再处理。配置好JDK并设置JAVA_HOME后建议在命令行跑一次java -version和javac -version确认两个版本一致避免“能跑但编译不过”的尴尬局面。5. 手写算法题排序、链表与其他高频题型5.1 排序算法冒泡排序与快速排序的完整实现网易笔试的编程题很大概率会考察排序。要么是直接让你手写某个排序算法要么是考排序的变种应用。冒泡排序是最基础的排序实现简单但大O复杂度是O(n²)。笔试中出现时通常是作为一个更复杂题目的子步骤。这里给出一个优化的冒泡排序实现用了一个swapped标志位如果某轮没有交换说明已经有序提前退出public static void bubbleSort(int[] arr) { if (arr null || arr.length 2) return; 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; } } }快速排序就重要得多了。它是Java标准库中Arrays.sort()对于基本类型数组的排序算法基础DualPivotQuicksort笔试几乎必考。手写时要特别注意partition部分的边界条件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); } private static int partition(int[] arr, int left, int right) { int pivot arr[left]; int i left, j right; while (i j) { while (i j arr[j] pivot) j--; while (i j arr[i] pivot) i; if (i j) { swap(arr, i, j); } } swap(arr, left, i); return i; }这里选arr[left]为基准值也可以用三数取中法降低最坏情况概率但笔试时实现简单的版本就足够。快速排序平均时间复杂度O(n log n)最坏O(n²)这点如果题目问复杂度要能准确回答并说出最坏情况什么时候发生已排序数组 固定选首元素作基准。5.2 链表、栈、队列笔试现场的“中阶题”除了排序链表操作也是高频考点。网易的编程题经常以“单链表反转”、“判断链表是否有环”、“合并两个有序链表”这种经典题目出现。这类题强烈建议动笔之前先画图把指针指向理清楚再写代码。链表题的Bug绝大多数出在空指针上所以要特别留意cur.next是不是可能为null。栈和队列的考题则通常结合“用两个栈实现队列”、“括号匹配”这类题目。括号匹配是经典中的经典用栈做一次遍历就行左括号入栈右括号出栈并检查匹配最后再看栈是否为null或者empty。Java中栈建议用Deque接口的ArrayDeque实现而不是Stack类因为Stack继承了Vector有同步开销。5.3 高频算法题型的准备思路针对2018网易实习笔试的算法题型我整理了一个备考优先级表优先级题型典型题目建议准备方法高字符串处理反转字符串、最长公共前缀、判断回文串熟悉StringBuilder/String API注意边界高数组与双指针两数之和、移动零、盛最多水的容器多练双指针套路高链表操作反转链表、环形链表、合并有序链表画图辅助注意空指针中栈与队列有效括号、用两个栈实现队列明确出入顺序即可中二叉树前中后序遍历、层序遍历、最大深度深度用递归层序用队列迭代中简单动态规划爬楼梯、最大子数组和、斐波那契数列想清楚状态转移方程就写代码低图论拓扑排序、最短路径记住模板实习生考到概率偏低很多同学以为笔试算法题要刷LeetCode的Hard题才稳但其实对于实习生岗能把上面的Easy到Medium题快速、准确地写出来通过率已经很高了。网易的技术面试更看重“数据结构和编码基本功”而不是竞赛技巧。6. 常见问题与避坑指南6.1 笔试中那些让人后悔莫及的失误从我带过的实习生和身边同学的经验来看能通过笔试的人不一定是最聪明的但一定是最稳的。以下几个错误几乎是每年都有人犯的审题不清。题目要求输出“满足条件的个数”你输出“满足条件的值”题目要求“不能使用额外空间”你new了一个新数组。这个坑完全可以通过在草稿纸上划出关键词来规避。循环边界错误。数组长度为n很多同学在写for循环时习惯用 n而不是 n导致数组越界异常。网易的在线编程环境对运行时异常很敏感一次IndexOutOfBoundsException可能直接让整道题归零。如果编译和测试用例能在本地运行写完以后务必用nums.length检查一下循环边界。没有考虑空输入和边界输入。输入数组是空的怎么办只有一个元素怎么办target本身就是极值怎么办这些边界情况是笔试用例中必测的内容。如果题目没有明确说明“输入非空”默认就要处理。编程题不写思路、只贴代码。如果在线编程环境支持写注释强烈建议在代码最上方用两三句注释描述自己的算法思路和复杂度。有些时候系统会做代码查重或人工二次审核清晰的注释能帮你留下好印象。6.2 常见的Java编译运行报错速查表把开发学习中经常遇到的“环境坑”整理成表格遇到直接查报错信息原因解决方案源发行版17需要目标发行版17Maven/IDE编译级别与JDK版本不一致统一pom中java.version、maven.compiler.source/targetJava: OutOfMemoryError: insufficient memoryJVM堆内存不够调大-Xmx参数或检查是否有无限往集合新增数据Java中数组越界异常 ArrayIndexOutOfBoundsException访问了不存在的下标检查循环边界和索引计算逻辑Lombok不支持当前编译器Lombok版本与JDK/IDE不匹配升级Lombok依赖并开启Annotation Processing编码乱码IDE默认字符集与源文件编码不一致统一设置为UTF-8找不到或无法加载主类classpath配置错误重新编译并检查命令或IDE运行配置6.3 一份可执行的Java学习路线建议如果你现在是零基础或者基础薄弱想在未来几个月内达到参加网易实习生笔试的水平我建议的学习顺序是第一步搞定Java语法。变量、数据类型、运算符、流程控制、数组、方法这些是地基大概需要一到两周。第二步深入面向对象。类与对象、封装继承多态、接口、抽象类、内部类、枚举配合代码练习两周。第三步掌握常用类库。String相关、包装类、日期时间API、集合框架重点、IO流、异常处理这三周是核心期。第四步学JVM与并发。内存区域、垃圾回收、类加载、synchronized、volatile、线程池两周时间能看个大概。第五步进入框架领域。Spring/SpringBoot入门、Maven使用、MyBatis等两周上手。第六步刷题期。LeetCode按标签刷每天三到五道坚持一个月重点死磕数组、链表、字符串、二叉树、简单动态规划。整个周期大概三个半月到四个月每天保持三小时以上。如果能严格执行实习笔试的基本盘就稳了。写在最后的个人体会网易2018年的这套JAVA开发实习生笔试题难度在大厂中属于中等偏上但它的价值不在于题目本身而在于它帮所有候选人划了一条清清楚楚的“及格线”语法基础是否扎实、集合与并发是否真的用过、手写代码是否干净利落。我在后来做技术面试官的过程中反复验证了一个规律——笔试成绩好的人不一定能成为最优秀的工程师但笔试成绩稳定地好的人通常基础都不会差。最后再分享一个我自己的小技巧笔试前一周不要刷新题把所有做过的错题重新过一遍特别是那些因为“不仔细”而错的题。把错误分类记下来比如“循环边界写错”、“没判空”、“类型转换遗漏”考试时留出五分钟专门检查这些点。这一招帮我避免了不少无谓的失分你也可以试试。
返回列表