ARTICLE DETAIL

资讯详情

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

Java校招笔试高频考点全解析:集合、JVM、并发与SQL

Java校招笔试高频考点全解析:集合、JVM、并发与SQL 上周整理收藏夹翻到一份货拉拉2018秋招的Java工程师笔试题卷二A顺手发给一个正在准备校招的学弟。他看完第一反应是这题也太老了还能考吗我跟他说你先别管年份自己做一遍再说话。结果他做完沉默了半天说了一句我发现自己可能连Java基础都没学扎实。这件事让我很强烈地意识到一个普遍问题很多同学准备校招时喜欢追新技术、追框架、追高级感却忽略了一个事实——大部分笔试考的不是你会不会用Spring Cloud而是你对Java这门语言本身的理解深不深。这份2018年的卷子题型朴素、考点常见没有一道题是偏怪难但真正能拿高分的人并不多。这篇文章我就以它为引子把Java校招笔试常见的命题思路、必考考点、典型题目和备考方法从里到外掰开揉碎讲一遍。适合正在准备Java方向秋招的同学、想转行Java开发的兄弟以及任何一个想系统性检验自己Java基础的人。1. 先给这套题定个位它考的就是最不该丢分的Java基础1.1 校招笔试题的设计逻辑不是刁难你而是淘汰人我先说一下我的判断。像货拉拉这类业务驱动型公司校招简历量非常大笔试的核心目的并不是筛选出技术最牛的那批人而是用最可控的成本把基础不过关的人淘汰掉。所以你会发现这类笔试题有一个明显特点考点非常集中——集合、并发、JVM、SQL、简单算法几乎每个模块都有涉及但深度都不会很深。真正的难题往往出现在二面、三面的追问环节而笔试只要保证会做的全做对、不会做的能蒙对一部分就已经能超过一大批人了。这背后其实是一个筛选漏斗的问题笔试是漏斗最宽的一层如果用太难的题会把一批实际动手能力不差但考试发挥一般的候选人误杀如果用太简单的题区分度又不够。所以折中的做法就是出正常人复习过就能做对的题。理解了这一点你就明白了复习方向——把面铺开把高频考点吃透远比钻牛角尖研究冷门知识点有用。很多技术社区里盛传的Java八股文本质上就是围绕这些高频考点沉淀下来的标准答案。八股文这个词虽然有调侃成分但它的价值恰恰在于帮你把散落的知识点系统化、标准化让你在笔试和面试里能快速、准确地组织语言。1.2 2018年的题放到现在为什么依然能打有些人会说Java都更新到21了2018年的题还有什么参考价值问这个问题的人多半还没理解Java这个生态的稳定性。HashMap的put流程、ConcurrentHashMap的锁机制、JVM运行时数据区、synchronized和ReentrantLock的区别——这些核心知识点从JDK 8到JDK 21本质都没变过变的只是细节优化。校招笔试不像你想象中那样频繁追新JDK 8、JDK 11依然是大量公司的生产主力版本所以2018年的卷子不但没过时反而代表了最常见的出题风格。而且我特别想强调一点老题比新题更干净。现在的很多笔试题动不动就结合微服务、分布式、中间件反而把Java基础挤到了角落。而2018年这种卷子题型朴素、陷阱伏笔少更适合拿来当一套Java基础自测题。你要是能把这套卷子做到80分以上再去看现在那些花里胡哨的笔试题底层逻辑都是通的。这也是为什么到现在还有人在网上翻这套题的原因——它就像一面镜子能照出你最真实的基础水平。2. 还原试卷结构一份Java笔试题通常由哪几部分组成2.1 选择题与判断题覆盖面广答得快也最容易粗心从网上放出来的这套题干信息来看卷二A这类试卷的前半部分基本以选择题、判断题为主。这个板块考察的范围非常宽Java基础语法、运算符优先级、String和基本类型的包装类、访问修饰符、异常体系、集合特性、IO/NIO偶尔还会夹带一两道多线程和JVM的基础概念题。这种题考察的不是你会不会写代码而是你对这门语言的细节掌握得是否准确。比如Integer a 127; Integer b 127; a b的结果是什么String被final修饰为什么说它不可变ArrayList和LinkedList在插入、删除、随机访问上的时间复杂度分别是多少try-catch-finally里finally中的return会不会覆盖try中的return数组越界异常ArrayIndexOutOfBoundsException是运行时异常还是受检异常这些都是典型的笔试选择题素材。很多同学会觉得我平时写代码没考虑过这些但笔试就爱考这些看似没用的细节。原因很简单这些细节反映的是你对语言底层机制的理解而不是单纯的API调用能力。判断题更是如此往往一个关键字眼比如一定必须所有就能让整句话从对变成错读题时稍不留神就会踩坑。2.2 简答题考的是你能不能把原理说成人话简答题是校招笔试里最有区分度的一部分。常见题目包括谈谈HashMap的实现原理、什么是JVM类加载机制、进程和线程有什么区别、ConcurrentHashMap是如何保证线程安全的、为什么重写equals时必须重写hashCode、谈谈你对GC的理解。这类题在阅卷时最重要的是答到点子上。比如问HashMap原理你要能说清楚它底层是个数组数组元素是链表头节点发生哈希冲突后用链表存储JDK 8开始当链表长度超过阈值8且数组长度超过64时链表会转成红黑树降低查询时间复杂度扩容时重新计算哈希位置容量是2的幂次。你不需要把源码背得一字不差但核心机制必须说清楚最好还能举一个实际例子。据我观察很多同学简答题失分的点不在于不会而在于说不清楚。比如问进程和线程有什么区别只写一句进程是资源分配的最小单位线程是CPU调度的最小单位就结束了。这样太干。要拿高分得把一个进程里可以有多个线程线程共享进程的内存空间和资源但每个线程有自己的栈和程序计数器这些知识点也带上答得越完整阅卷人给的分数越高。这里就体现出背八股文的另一个好处它帮你提前把答案组织得有条理到考场上不用现想。2.3 编程题与SQL题硬实力的直接检验笔试的最后部分通常是编程题和SQL题。编程题常见的有手写单例模式、实现冒泡排序/快速排序、判断链表是否有环、反转字符串、统计字符串中每个字符出现的次数、写一个死锁示例等。这类题考察的维度有三个能不能写出正确代码、边界条件是否考虑周全、代码风格是否规范。我在帮人改笔试代码的时候见过太多逻辑对但细节烂的写法——数组越界不检查、整数除法没考虑除数为零、循环边界差一个、方法命名是a/b/c。这些都是笔试阅卷时肉眼可见的扣分项。SQL题也经常出现在Java笔试题里因为Java后端开发离不开数据库。常见题型多表关联查询、GROUP BY分组统计、HAVING与WHERE的区别、子查询、索引相关概念。比如查出每个部门中薪资最高的员工这种题就是典型的多表关联分组取最大值看起来简单但能一次写对的人并不算多。我后面会专门拆解这道题的几种写法。3. 高频考点拆解Java工程师笔试必须拿下的几个知识模块3.1 面向对象与语法细节最容易被扣分的送分题先说说最基础的。Java是面向对象语言笔试必考封装、继承、多态。三者的含义我相信大部分人都知道但笔试喜欢考的是它们看起来简单、做起来容易错的变形题。比如重载和重写的区别、向上转型和向下转型的规则、静态方法能不能被重写、构造方法能不能被final修饰、接口和抽象类的区别。再比如和equals的区别比较的是引用地址equals在Object类中也比较地址但String、Integer这些类重写了它变成比较内容。笔试题里经常拿new String(a)、字符串常量池、Integer缓存范围-128到127出文章稍不留神就掉坑里。还有String的不可变性为什么它在频繁拼接字符串的循环里性能很差而StringBuilder不会因为每次拼接都新建对象——这些都是笔试的热门素材。Java 8之后引入的 lambda 表达式、Stream API、函数式接口、枚举类型的使用近年来也常出现在选择题里。面试官不是想考你会不会用list.stream().map(...).collect(...)这种写法而是看你能不能说出 lambda 表达式在底层是怎么实现的invokedynamic、枚举与普通类的区别枚举本质是继承了 Enum 的 final class、switch 能不能用 String 和枚举等等。这些属于新技术里最基础的部分也确实是容易拉开分数的地方。3.2 集合框架HashMap是永远的神如果让我只能押一道笔试必考题我押HashMap。原因很简单它能考察太多层面了——数据结构、哈希算法、红黑树、扩容机制、线程安全性每个点都能往下深挖。结论是这个东西你花三天时间彻底搞懂笔试里至少能稳拿5到8分。要掌握它至少要能回答这些问题HashMap的底层数据结构是什么JDK 7和JDK 8有什么变化put一个key-value时具体流程是什么为什么HashMap是线程不安全的会出现什么问题死循环、数据覆盖为什么默认负载因子是0.75为什么容量必须是2的幂什么时候链表转红黑树为什么是8JDK 7和JDK 8在扩容上有什么优化为什么用尾插法把这些搞明白你不但能应对笔试选择题面试时遇到HashMap从入门到放弃系列追问也基本不慌。我在项目里排查线上问题时就遇到过因为HashMap并发put导致数据覆盖的情况这种真实场景下的理解远比背答案来得深刻。集合这块还有一个高频考点是线程安全类。Hashtable 和 ConcurrentHashMap 的区别、Collections.synchronizedList 和 CopyOnWriteArrayList 的适用场景、TreeMap 的排序原理红黑树、LinkedHashMap 怎么实现 LRU、fail-fast 机制是什么。这些点不需要全部深入源码但至少要能说出是什么、为什么、怎么用。3.3 JVM内存与OOM从原理到排查JVM是Java笔试和面试的第二座大山仅次于集合。先说运行时数据区程序计数器、虚拟机栈、本地方法栈、堆、方法区元空间/永久代。笔试喜欢考哪个区域会出现OutOfMemoryError、哪个区域是线程共享的、哪个区域是线程私有的。这类题只要死记加理解就能拿分性价比极高。再往下是垃圾回收可达性分析算法、GCRoots有哪些、常见的垃圾回收算法标记-清除、标记-复制、标记-整理、分代收集理论、年轻代和老年代各自用什么回收器。2018年的卷子大概率会出现在选择题或简答题里考法很直接比如CMS收集器的主要特点是什么Minor GC 和 Full GC 的区别是什么。还有一个重要的点是OOM的排查思路。很多同学笔试碰到线上内存溢出你怎么排查这种问题就懵了。实际流程是先看报错日志判断是堆溢出java.lang.OutOfMemoryError: Java heap space、栈溢出StackOverflowError还是元空间溢出然后通过jmap -heap pid查看堆内存使用情况用jstack查看线程状态必要时用jstat观察GC频率如果怀疑代码有内存泄漏还要 dump 出堆快照用 MAT 或 VisualVM 分析哪些对象占用了大量内存。这些在笔试里只要写出思路就能得分但很多同学连工具名都说不出来。这里正好关联到很多人开发环境里见过的java: outofmemoryerror: insufficient memory——其实这个报错是IDEA、Eclipse或者某些在线判题系统启动JVM时的常见提示本质是可用内存不够解决办法通常是调整-Xmx、-Xms参数或者关掉一些占用内存的程序。笔试现场如果遇到这种问题先别慌基本不是你的代码问题而是环境问题。3.4 并发编程线程、锁与线程池并发编程同样是笔试重灾区。基础题有创建线程有哪几种方式、sleep和wait的区别、synchronized加在静态方法和实例方法上有什么区别、volatile能保证什么不能保证什么、什么是死锁以及如何避免。这里我特别想提 volatile 和 synchronized 这对老搭档。很多同学背了结论——volatile保证可见性和有序性但不保证原子性——但不知道为什么。原因在于Java内存模型每个线程有自己的工作内存volatile通过内存屏障让变量修改后立即刷回主内存其他线程再读取时能看到最新值但它无法解决多个线程同时执行count这种读-改-写操作的原子性问题。把原理搞清楚之后再遇到相关选择题就完全不怕了。线程池也是高频考点大名鼎鼎的ThreadPoolExecutor七个参数核心线程数、最大线程数、空闲存活时间、时间单位、任务队列、线程工厂、拒绝策略。笔试简答题常见问法是线程池的核心参数有哪些分别代表什么意思选择题则喜欢考任务提交后线程池的调度流程是什么先看核心线程是否已满没满就创建新线程执行满了就放入工作队列队列也满了再看最大线程数如果最大线程数也满了就执行拒绝策略。拒绝策略有四种AbortPolicy默认抛异常、CallerRunsPolicy调用者线程执行、DiscardPolicy直接丢弃、DiscardOldestPolicy丢弃最老任务。3.5 数据库与SQL笔试里隐藏的加分项说句实在话很多Java同学在笔试中花大量时间复习Java反而把SQL给忘了结果笔试一拿到数据库题就懵。实际上数据库在Java工程师笔试题里出现的频率非常高因为它能直接考察你的后端基本功。SQL高频题通常集中在几个方面多表查询INNER JOIN、LEFT JOIN、RIGHT JOIN的区别和实际使用场景聚合函数与分组GROUP BY、HAVING、MAX/MIN/SUM/COUNT/AVG子查询与临时表什么时候用 EXISTS、什么时候用 IN索引普通索引、唯一索引、复合索引的最左前缀原则、哪些情况会导致索引失效事务ACID四个特性、四种隔离级别读未提交、读已提交、可重复读、串行化以及各自解决的并发问题面试和笔试中还经常考一道经典题MySQL默认隔离级别是什么可重复读MVCC机制是如何实现的以及为什么可重复读能解决幻读但依然可能会有问题。能答到这一层基本就能碾压大部分同岗位候选人。3.6 环境与工程能力容易被忽略的隐性考察最后说一个很多同学没意识到的问题笔试不一定只是考Java语法还会在操作环境里顺带考察你的工程能力。比如很多人搜索过的java环境变量配置、vscode运行java报错乱码、java: 警告: 源发行版 17 需要目标发行版 17、java: you arent using a compiler supported by lombok等这些看起来是开发环境问题但恰恰是笔试现场最真实的拦路虎。举个例子很多在线笔试平台用的是浏览器内嵌代码编辑器不是本地IDE你平时在IDEA里写Java被智能提示惯坏了到了笔试环境连import java.util.*都会漏写。还有些平台要求你在本地写完再上传那配置JAVA_HOME、PATH、使用Maven命令编译打包就变成了隐性考点。建议大家在考试前至少自己手动用命令行javac编译运行一次Java程序体验一下没有IDE辅助时写代码是什么感觉。另一个常见坑是编码问题。Windows下中文注释、
返回列表