
浩鲸科技2020届Java笔试这个话题放在今天看可能有点“考古”了但经历过的人都清楚它基本代表了国内中型偏上软件公司校招机考的典型套路。浩鲸科技前身是中兴软创后来有阿里投资背景主做运营商、政企这类大客户的B端系统所以它家的笔试不会太偏门也不会纯粹考脑筋急转弯而是实打实考察你的Java基础功底、集合理解深度、JVM内存认知以及手写代码的稳定性。如果你正在准备校招或者想检验自己的Java基础到底扎不扎实这份笔试的考点分布和出题思路很有参考价值。我是2020届参加的那批当时还专门把考场上遇到的知识点、写过的代码、踩过的坑整理了一份复盘笔记后来靠这套笔记又顺手拿了几家offer。今天把这份内容重新梳理一遍结合后来的工作实践尽量还原当时的笔试场景和解题思路希望能给准备Java校招的同学一些真正有用的东西。1. 浩鲸科技笔试的总体印象1.1 校招机考到底在考什么先说结论浩鲸科技2020届Java笔试考察的核心是“基础扎实度编码熟练度”不是难度竞赛。和互联网大厂那些动辄考红黑树手写、LRU缓存设计的笔试不一样浩鲸的题目更偏向实际开发中每天都在用的知识点比如面向对象的三重特性、集合框架的底层原理、异常处理机制、IO流操作以及一道或两道经典的排序算法题。为什么是这种风格这和公司业务有关。浩鲸做的电信BSS/OSS系统、政企数字化项目代码量大、业务复杂度高、系统长期迭代团队需要的是招进来就能干活、不需要重新补基础的人。所以笔试里那些看似简单的题目实际是在筛掉“只会背面试题但写不出代码”的人。另外要注意浩鲸的笔试是机考不是纸质试卷题目通过在线OJ系统提交部分编程题需要你在本地写完再粘贴或者直接在网页编辑框里写。这个细节很重要因为网页编辑器没有IDE的自动提示和电脑快捷键很多人平时写代码离不开IDEA的“CtrlSpace”一到网页编辑器就卡壳。所以准备阶段一定要在没有任何提示的环境下多练手写代码。1.2 题型分布与时间分配建议从题型上说我当时那场大概分三块选择题/填空题、简答题、编程题。选择题和填空题覆盖面很广基本是Java基础语法、面向对象概念、集合类、String/StringBuilder、异常、多线程基础、JVM基础大概20到30题。简答题一般会有2到3题考察你能否用文字清晰表达某个机制的运行过程比如“HashMap的put流程”或“描述一下JVM堆内存的划分与GC流程”。编程题通常是1到2道常见是数组操作、字符串处理、排序算法实现。时间安排上如果总分120分钟我的建议是选择填空控制在40分钟以内简答题30分钟左右剩余时间全部留给编程题。编程题宁可最后没写完也不要在前面纠结太久因为编译运行和调试都是要花时间的。我当时就是在选择题上犹豫太久导致最后一道快速排序写得不完整交卷后复盘觉得非常亏。2. Java基础高频考点拆解2.1 面向对象三大特性不止会背概念面向对象编程OOP几乎是每一家Java公司笔试的必考项浩鲸也不例外。但请注意选择题不会直接问你“什么是封装”而是给你一段代码让你判断某个变量能否访问、某个方法能不能重写、运行时输出是什么。比如封装考点往往落在访问修饰符上。public、protected、default、private的作用范围要具体到“不同包下的子类能否访问default成员”这种粒度。protected的真实含义是“同包内可见不同包的子类中可见”而不是“对所有子类都可见”很多人就栽在这里。继承和多态的考点更典型父类引用指向子类对象时调用虚方法的输出构造器执行顺序父类静态块、子类静态块、父类实例块、父类构造器、子类实例块、子类构造器也常考。这道题考察的是静态块和实例块在继承关系中的执行次序关键是静态初始化只发生一次实例初始化每次new都会执行。如果这些细节你只是“有印象”建议专门用代码验证一遍笔试中这类题是送分题拿不到就亏了。2.2 集合框架HashMap扩容机制是重头戏浩鲸的笔试题里集合框架相关题目占比非常高尤其是HashMap。我印象很深刻当时选择题里有一道类似这样的变体题“已知默认加载因子是0.75初始容量为16当元素数量达到多少时会发生扩容”正确答案是13因为16×0.7512也就是说插入第13个元素时触发扩容。这个考点看似简单但很多人会误以为是“元素超过12个就扩容”其实扩容发生在put第13个元素时而且是一次新的扩容每次扩容都伴随rehash。Jdk1.8后HashMap引入了红黑树当链表长度达到8且数组长度大于等于64时链表才转红黑树。这个“两个条件同时满足”的细节也会出现在选择题中。数组长度没到64但链表长度已经超过8时HashMap不会转树而是先扩容resize。为什么是8官方注释里给了泊松分布的推导平均查找长度在链表长度为8时已经优于红黑树这个原理最好能说清楚简答题考察“为什么链表转红黑树的阈值是8”时能答到点子上。另外HashSet其实底层就是HashMapHashSet的add操作是将元素作为key、一个固定的空对象作为value放入map中。所以HashSet不能有重复元素、不能保证顺序的原理都可以从HashMap推导出来。这些底层逻辑笔试题目表面在考集合实际上在考你“有没有读过源码”。2.3 异常机制与finally经典陷阱题Java异常体系也是浩鲸爱出题的领域。考察点通常是Error与Exception的区别、受检异常与非受检异常、自定义异常以及try-catch-finally的执行顺序。其中有一道经典陷阱题我必须单独拎出来当try和finally中都包含return语句时函数最终返回什么答案是finally中的return会覆盖try中的return。如果finally中只是修改变量、没有return那么返回值在return之前已经确定finally里改引用类型对象的属性会生效但改基本类型变量或重新赋引用则不会影响返回值。很多人在这里想当然一看到finally修改了就以为返回值变了实际要分情况讨论。我建议你写一段代码验证一下这三个场景try中有return且finally无return、try中有return且finally修改基本类型变量、finally直接return。笔试里这种题只要出那就是一道典型的“会给对手送分”的题你不拿就亏了。3. JVM与内存溢出笔试里最容易被考崩的一块3.1 OutOfMemoryError的常见场景与排查思路热词里有个“java: outofmemoryerror: insufficient memory”这其实是我们使用Java开发时最常见的报错之一。在浩鲸笔试的简答题或选择题中JVM内存相关题目往往围绕OOM展开。你得能说清楚OOM是什么时候抛出的、有哪些类型、分别怎么解决。从JVM规范看OOM大致有几种场景Java堆溢出最常见的OutOfMemoryError: Java heap space、元空间/方法区溢出、栈溢出StackOverflowError注意它不属于OOM、直接内存溢出。笔试中常见问法是“如果线上系统频繁FullGC且堆内存持续增长如何排查”这种问题其实有固定套路先用jstat查看GC情况再用jmap dump堆快照然后用MAT或JProfiler分析大对象和泄漏链。我在后期工作中真的遇到过这类问题。当时一个定时任务每天凌晨都会OOM起初以为是内存不够调大了-Xmx参数结果第二天照旧。后来用jmap dump分析才发现是一个全局缓存Map在批量导入时没有被清理数据量达到一定程度就把堆撑爆了。这段经历让我意识到笔试里考内存排查不只是背命令而是要理解“内存中的对象到底被谁引用着”。如果时间允许建议自己搭一个内存泄漏场景用VisualVM或JConsole观察一下老年代的变化这种体感是看文档得不到的。3.2 堆、栈、方法区与GC基础JVM基础知识的考察大概率包括运行时数据区划分、堆内存分代模型、常见的垃圾回收算法和收集器。运行时数据区中要能区分线程共享和线程私有的区域堆和方法区是线程共享的虚拟机栈、本地方法栈、程序计数器是线程私有的。考题喜欢问“一个局部变量、一个静态变量、一个new出来的对象分别存在哪里”答案不是简单说“局部变量在栈、对象在堆”就完了还要分情况说明如果局部变量是引用类型那么引用本身在栈帧的操作数栈中引用指向的对象在堆中如果局部变量是基本类型数组的引用数组也在堆中。GC方面笔试不会考得太深但至少要知道年轻代用复制算法、老年代用标记-整理或标记-清除CMS和G1的区别STW时间、是否会产生碎片、是否支持并发清理。为什么年轻代不用标记-整理因为年轻代“朝生夕灭”的对象比例高复制算法效率更高只需复制少量存活对象。这种“为什么用这个算法”的思考往往比背算法细节更能得分。4. 算法编程题手写排序是必修课4.1 冒泡排序别小看这道“基础题”编程题中最常出现的排序算法冒泡排序算一个。很多同学觉得冒泡排序太简单不值得花时间但笔试里它出现的频率恰恰说明了一个问题越基础的题越能拉开差距。冒泡排序的核心是相邻元素两两比较大的往后冒。标准写法public static void bubbleSort(int[] arr) { for (int i 0; i arr.length - 1; i) { for (int j 0; j arr.length - 1 - i; j) { if (arr[j] arr[j 1]) { int temp arr[j]; arr[j] arr[j 1]; arr[j 1] temp; } } } }但笔试如果只写出这个版本可能只能拿基础分。更好的做法是加一个标志位优化在内层循环如果没有发生交换说明数组已经有序直接跳出外层循环public static void bubbleSortOptimized(int[] arr) { boolean swapped true; for (int i 0; i arr.length - 1 swapped; i) { swapped false; for (int j 0; j arr.length - 1 - i; j) { if (arr[j] arr[j 1]) { int temp arr[j]; arr[j] arr[j 1]; arr[j 1] temp; swapped true; } } } }这个优化版能让最好情况下的时间复杂度降到O(n)。笔试中能写出优化版说明你不只是背代码而是理解了排序的本质。冒泡排序的时间复杂度、空间复杂度O(1)、稳定性稳定这些也要随口就能答出来。4.2 快速排序写对容易写稳难另一道高频编程题是快速排序。浩鲸这类公司之所以爱考快排是因为它综合考察了递归思想、数组下标的边界控制、基准值选择策略比冒泡排序更能看出编码功力。快速排序的思路是分治选一个基准值把小于基准的数放左边、大于基准的数放右边然后递归处理左右两个子区间。最经典的写法是Hoare版本和Lomuto版本笔试中推荐写Lomuto版本因为代码更短逻辑更容易被看清public static void quickSort(int[] arr, int low, int high) { if (low high) { int pivotIndex partition(arr, low, high); quickSort(arr, low, pivotIndex - 1); quickSort(arr, pivotIndex 1, high); } } private static int partition(int[] arr, int low, int high) { int pivot arr[high]; int i low - 1; for (int j low; j high; j) { if (arr[j] pivot) { i; swap(arr, i, j); } } swap(arr, i 1, high); return i 1; } private static void swap(int[] arr, int i, int j) { int temp arr[i]; arr[i] arr[j]; arr[j] temp; }这段代码有个特别容易被忽略的边界条件if (low high)这个判断不能丢否则递归无法终止。另外要注意arr[j] pivot是“小于”而不是“小于等于”如果用“小于等于”相等的元素会被交换到左边虽然结果一样但会导致不必要的交换。笔试时如果题目要求只用快排且没有特别说明建议选择第一个元素或最后一个元素作为基准值。如果题目提到“要求最坏情况下时间复杂度接近O(n log n)”那就要考虑三数取中法选基准值。这种细节在编程题中往往能成为加分项。4.3 笔试现场的审题与调试技巧编程题不只是写出来就行OJ系统会有一个或多个测试用例你的代码必须通过所有用例才给满分。所以审题特别重要我总结过几个笔试现场容易踩的坑。第一题目要求输入格式要看清。有些题是用Scanner逐行读取有些则是以固定格式传入参数。如果题目说“第一行输入n第二行输入n个整数”你就要用hasNextInt之类的灵活处理方式而不是先假设一个固定行数。第二输出格式必须严格一致比如要求每个数字之间用空格隔开末尾不能有多余空格这种细节没注意也会被判定为格式错误。第三遇到不会做的题不要直接放弃写出暴力方案也比空着强OI系统的部分测试用例往往不看超时能过一半算一半。另外提醒一句笔试现场不要花太多时间追求“最优解”先写一个能跑的版本再考虑优化。有同学一上来就想写O(n log n)的解法结果是没想出来连O(n²)的也没写。这种情况在笔试中非常可惜因为很多题目的数据范围其实允许O(n²)的解法通过。5. 易错点、环境问题与避坑清单5.1 编译运行环境中的常见坑整理热词时发现有大量“java安装”“java环境变量配置”“java环境配置”“java: 源发行版 17 需要目标发行版 17”“java: you arent using a compiler supported by lombok”这类问题。这说明很多人在笔试准备阶段卡住的第一个环节不是知识点而是本机的Java运行环境。首先是JDK版本问题。现在很多同学的第一台开发机直接装了JDK 17、JDK 21但公司笔试系统可能要求JDK 8或JDK 11。不同JDK版本之间的枚举、String、集合API有细微差异但更常见的是Maven或Gradle编译失败源发行版17需要目标发行版17说明项目的Java编译级别配置和当前JDK版本不匹配。解决办法是检查pom.xml中的maven.compiler.source和maven.compiler.target或者IDE的项目结构设置。如果笔试前发现自己的代码在本机能跑、到OJ上编译报错大概率就是JDK版本差异导致的。还有一个特别常见的坑是Lombok。热词里那句“you arent using a compiler supported by lombok, so lombok will not work”是很多人在新版本JDK上运行Lombok插件时看到的报错。Lombok是在编译期通过注解处理器生成getter、setter等代码的但新版JDK内部API发生了变化老版本Lombok不兼容就会报这个错。笔试系统如果有代码检查或自动编译建议不要在考场上依赖Lombok的Data、Builder这些注解直接用IDEA的Generate生成getter/setter或者手写稳妥得多。笔试的本意是考察你Java基础不是考察Lombok。5.2 常见选择题陷阱整理做题过程中有些高频陷阱我整理了一张速查表你在备考时可以对着看String是不可变的StringBuilder和StringBuffer是可变的StringBuffer的方法是synchronized的性能低于StringBuilder。String str abc与new String(abc)的区别前者在字符串常量池中后者在堆中创建新对象用比较时结果是false。数组越界异常ArrayIndexOutOfBoundsException是RuntimeException编译期不会提示属于非受检异常不需要显式捕获。枚举类型enum隐式继承java.lang.Enum不能显式继承其他类但可以实现接口。枚举的构造函数默认是private。标识符命名规则字母、下划线、美元符开头不能以数字开头不能是关键字区分大小写。笔试经常出这种送分题。基本数据类型的默认值int是0boolean是false引用类型是null局部变量在使用前没有默认值必须显式初始化否则编译报错。这些题单独看都不难但放在一起很容易因为粗心丢分尤其是“局部变量没有默认值”这一点很多人用成员变量的规则去套局部变量结果选错。5.3 答题策略把得分效率提到最高时间分配在机考中的重要性不亚于知识点本身。我的经验是做题顺序按照“分值高、耗时低”优先先做选择题和填空题遇到纠结的题先标记别在单个选项上消耗3分钟。编程题全部放到最后统一做因为编程题需要你进入“写代码”的思维状态如果插在选择题中间思维切换的成本非常高。编程题先读题、理清边界条件再动手写写完先在自己脑海里跑一遍测试用例确认无误后再提交。如果系统支持多次提交那就用“先暴力拿分、再优化满分”的策略不要一上来就憋大招。还有一点千万注意和周围同学的代码风格保持独立。公司在线OJ一般有相似度检测只要代码结构雷同就很容易被判为作弊。我当时旁边一个同学就因为在代码里写了和网上教程一模一样的注释而被判违规特别冤枉。6. 考后复盘与准备路线这些经验后来帮了我大忙6.1 把笔试当成一次“知识体检”笔试结束后无论结果如何第一件事不是对答案而是把能回忆起来的题目全部记下来。我当时是趁着印象清晰第一时间把选择题里拿不准的题目、简答题的表达思路、编程题写的代码完整复盘了一遍然后对照考点逐条梳理自己的知识盲区。复盘的关键在于把“觉得会”和“真正会”区分开。例如JDK集合的Fail-Fast机制、Java 8的Stream和Lambda表达式、函数式接口与lambda的用法、枚举类型在不同场景下的实际应用这些都是非常容易被问到的点但如果你没有自己撸过代码考场上临时想很有可能想不全。我当时做的一件事就是把每个知识点整理成“概念代码示例易错点”的小卡片每天抽半小时过一遍效果比反复看教材好得多。6.2 笔试只是起点后续准备更关键浩鲸面试环节会进一步深挖笔试里暴露的问题。比如你在简答题里写了“HashMap是线程不安全的”面试官大概率会接着问“那线程安全的Map有哪些ConcurrentHashMap的实现原理是什么”。所以笔试结束并不是学习的终点而是以考促学的开始。准备路线方面我建议按以下优先级推进Java基础语法含面向对象、集合、异常是绝对的重点JVM和并发编程是进阶重点IO、网络、数据库是常用基础也应覆盖框架部分至少需要看懂Spring的IOC和AOP原理。算法方面不必追求偏题怪题常见的排序、查找、链表操作、字符串处理、简单动态规划题搞定就足够了。如果时间特别紧张每天至少刷两道LeetCode简单题、一道中等题重点练习“没有IDE提示时也能写对代码”。这种能力在笔试现场非常重要因为在线OJ的编辑框通常会暴露你对API记不熟、思路不清晰的弱点。6.3 我的个人体会与一个小建议现在回头看浩鲸科技2020届Java笔试我的最大体会是这类企业考察的从来不是“你会不会某个偏门知识点”而是“你能否在限定时间内稳定地写出高质量代码”。基础题占大头编程题不超纲整体风格踏实务实。很多同学笔试挂掉不是因为题目太难而是因为基础不牢、审题不清、考场时间分配不合理。最后分享一个我自己用过且验证有效的小技巧笔试前一周不要再用IDE写Java只用一个简单的文本编辑器记事本或VSCode关闭智能提示练习手写题目代码。这个过程会逼迫你记住常用类的完整类名、常用方法的签名、常见的集合API而不是依赖IDE的自动补全。我当时连续练了三天笔试时看那些选择题很多看一眼就能直接出答案因为那些API的拼写和用法已经在脑子里过了无数遍。这份笔试准备思路不仅适用于浩鲸科技也适用于绝大多数国内软件公司。Java基础强的同学认真准备一个月左右就能有明显提升基础薄弱的也不要慌把上面提到的知识点逐个吃透你会发现找工作的路会顺很多。