简介:这份 Java 初级面试题汇总文档面向刚从学校毕业或培训结业的求职者,帮助其在面试前系统梳理高频考点、建立完整的知识框架。内容按十八个模块组织,涵盖 Java 基础、多线程、反射、对象拷贝、JavaWeb、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/SpringCloud、Hibernate、MyBatis、RabbitMQ、Kafka、Zookeeper、MySQL、Redis 与 JVM,共收录 208 道题目并附参考答案。以 Java 基础模块为例,对 JDK 与 JRE 的区别、== 与 equals 的差异、hashCode 与 equals 的关系、final 关键字作用等常见问题均给出代码示例与逐行解读,便于理解而非死记。资源包内含 1 个 docx 文件,大小约 155KB,轻量易携带,可打印或导入笔记软件随时翻阅。目前已有 623 人学习,适合需要查漏补缺、按模块自测的初级 Java 求职者使用。
1. 刚学完 Java 却不敢去面试:这份 208 道题的清单到底能帮你什么
很多人学完 Java 语法后的第一个困惑不是“我能不能写代码”,而是“面试官问我 JDK 和 JRE 有什么区别,我该怎么答”。课本上讲过的概念,一到面试场景就变成一团模糊的记忆,这几乎是每个零基础转行或刚出校门的人都会遇到的坎。这份 Java 初级面试题汇总就是冲着这个坎来的:它把 Java 基础、多线程、反射、对象拷贝、JavaWeb、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/SpringCloud、Hibernate、MyBatis、RabbitMQ、Kafka、Zookeeper、MySQL、Redis、JVM 十八个模块的常见面试题整理成 208 道带答案的清单,专门服务刚从学校出来或者刚培训出来的 Java 人员。你不需要把它当成教材从头啃,它更像一张面试前的地图,告诉你哪些概念会被问、答案的边界在哪里、哪些细节容易翻车。适合谁?适合已经能写简单 Java 代码、但对面试没有底的新手;不适合已经工作三年以上、想深挖源码的人。
2. 为什么初级面试总卡在基础上:先搞懂这 208 道题在考什么
2.1 面试官问基础题,不是为难你,是在确认边界
零基础新手最容易犯的错,是把面试题当成背诵任务。比如“JDK 和 JRE 有什么区别”这道题,答案只有两句话:JDK 是 Java 开发工具包,包含 JRE 和编译器 javac;JRE 是 Java 运行环境,只负责运行程序。但面试官真正想确认的是,你知不知道“写代码”和“跑代码”需要的东西不一样。如果你只会背“JDK 包含 JRE”,追问一句“那我装了 JDK 还需要单独装 JRE 吗”,很多人就卡住了。这份清单的价值在于,它把每道题的答案边界画出来了,你顺着答案反推自己哪里没想清楚,比盲目刷题效率高得多。
再比如“== 和 equals 的区别”,原文给了一段代码示例:
String x = "string"; String y = "string"; String z = new String("string"); System.out.println(x == y); // true System.out.println(x == z); // false System.out.println(x.equals(y)); // true System.out.println(x.equals(z)); // true这段代码里,x == y为 true 是因为两个字面量指向常量池里的同一个引用;x == z为 false 是因为new String()在堆里另开了空间;而equals在 String 里被重写成了值比较,所以后两行都是 true。新手看这段代码,重点不是记住四个 true/false,而是理解“引用比较”和“值比较”是两件事。面试里只要你能把这两件事说清楚,这道题就过了。
2.2 十八个模块不是让你全背,是让你知道先背哪几个
208 道题铺在十八个模块里,新手一看就发怵。我第一次接触这类清单的时候,也想过“是不是要全部背完才能去面试”。后来发现完全不是这样。初级面试的出题密度集中在 Java 基础、多线程、集合、MySQL、Redis 和 Spring 这几块,RabbitMQ、Kafka、Zookeeper 在初级岗位里问得浅,往往只问“你用过吗、用来做什么”。所以入门阶段的策略是:先把 Java 基础模块的 34 道题过一遍,再把多线程和集合的高频题吃透,剩下的模块按“能说出概念和适用场景”的标准过一遍就行。
原文里 Java 基础模块的题目排列本身就很有参考价值:从 JDK/JRE 的区别,到==和equals,到hashCode和equals的关系,再到 String、抽象类、接口、IO 流、容器。这个顺序基本就是面试官提问的顺序,也是你复习的顺序。你不需要跳着看,顺着读下来,每一题都在前一题的基础上加一点难度。
2.3 第一个能跑的例子:用代码验证“== 和 equals”到底怎么回事
光看答案容易产生“我懂了”的错觉,跑一遍代码才知道自己真懂没懂。下面这段代码可以直接复制到任何 Java 环境里运行,不需要额外依赖:
public class EqualsDemo { public static void main(String[] args) { // 字面量方式创建,指向常量池同一引用 String a = "hello"; String b = "hello"; // new 方式创建,在堆里新开空间 String c = new String("hello"); System.out.println("a == b: " + (a == b)); // true,同一引用 System.out.println("a == c: " + (a == c)); // false,引用不同 System.out.println("a.equals(c): " + a.equals(c)); // true,值相同 // 自定义类不重写 equals,默认就是引用比较 Cat cat1 = new Cat("咪咪"); Cat cat2 = new Cat("咪咪"); System.out.println("cat1.equals(cat2): " + cat1.equals(cat2)); // false } } class Cat { private String name; public Cat(String name) { this.name = name; } }运行结果里,前三行输出对应 String 的引用比较和值比较,最后一行输出 false 是因为 Cat 类没有重写equals方法,默认继承 Object 的实现,而 Object 的equals本质上就是==。这段代码的意义在于,你亲手看到了“同一个值、不同引用”和“同一个值、同一个引用”的区别,面试时再被问到,你脑子里有画面,不是背出来的。参数方面没有需要改的地方,类名和变量名可以随意替换,但new String()和字面量赋值的对比要保留,这是这道题的核心。
3. 零基础怎么用这份清单:从 Java 基础到多线程的跟做路径
3.1 先花两天把 Java 基础模块过一遍,别贪多
拿到这份文档后,第一件事不是从第一页背到最后一页,而是先看目录,确认十八个模块里哪几个是你完全没接触过的。对零基础新手来说,Java 基础模块的 34 道题是唯一必须逐题吃透的部分,因为后面的多线程、集合、Spring 都建立在这些概念上。具体做法是:每天过 15 到 20 道题,每道题先看问题、自己试着答一遍,再看答案,答不出来的地方用笔标出来。两天过完一轮,第三天只看标出来的题。
这里有个血泪经验:不要一边看答案一边点头,那样过一遍等于没看。正确的做法是遮住答案,用自己的话把答案说一遍,说不清楚的地方才是你真正要补的。比如“抽象类必须要有抽象方法吗”这道题,答案是“不需要,抽象类不一定非要有抽象方法”,原文还给了一段没有抽象方法的抽象类代码。你如果能自己写出这段代码并解释为什么它能编译通过,这道题才算过。
3.2 多线程模块别死背,用一个小例子把概念串起来
多线程是初级面试里最容易翻车的模块,因为概念多、容易混。原文里列了并行和并发的区别、线程和进程的区别、创建线程的三种方式、线程状态、sleep 和 wait 的区别、线程池的七种创建方式等等。新手一上来就背“并行是多个处理器同时处理,并发是同一核上轮流执行”,背完就忘。更好的方式是写一个最小例子,把创建线程和线程状态串起来:
public class ThreadDemo { public static void main(String[] args) throws InterruptedException { // 方式一:继承 Thread Thread t1 = new Thread() { @Override public void run() { System.out.println("线程 t1 正在运行"); } }; // 方式二:实现 Runnable Runnable task = () -> System.out.println("线程 t2 正在运行"); Thread t2 = new Thread(task); System.out.println("启动前 t1 状态: " + t1.getState()); // NEW t1.start(); t2.start(); t1.join(); // 等 t1 执行完 t2.join(); System.out.println("结束后 t1 状态: " + t1.getState()); // TERMINATED } }这段代码把“创建线程的两种方式”和“线程状态”两个知识点串在一起了。start()之前状态是 NEW,join()之后状态是 TERMINATED,中间运行时的状态可能是 RUNNABLE。你跑一遍,再回头看原文里“线程有哪些状态”那道题,六个状态就不再是干巴巴的列表了。注意run()和start()的区别:直接调run()只是普通方法调用,不会开新线程,这也是原文第 43 题的重点。
3.3 集合模块用一张表把 List、Set、Map 的关系理清
集合是 Java 基础里题目最密的一块,原文从“Java 容器都有哪些”一直问到“怎么确保一个集合不能被修改”,中间夹着 HashMap 和 Hashtable 的区别、ArrayList 和 LinkedList 的区别、ArrayList 和 Vector 的区别。新手最容易混的是这些类之间的继承关系和适用场景。建议你自己画一张表,把 List、Set、Map 三大类下面的常见实现类列出来,标注“是否有序、是否允许重复、是否线程安全”三个属性。原文第 20 题给了一张 List、Set、Map 的对比表,你可以在此基础上补上具体实现类。
比如 ArrayList 和 LinkedList 的区别,原文的结论是“频繁读取用 ArrayList,插入删除多用 LinkedList”。这个结论背后是数据结构的不同:ArrayList 是动态数组,随机访问快但增删要移动元素;LinkedList 是双向链表,增删快但随机访问要从头找。你不需要背源码,但要知道这个结论是怎么来的,面试时被追问“为什么”才答得上。再比如 HashMap 和 Hashtable 的区别,记住三点就够:HashMap 允许 null 键值、非线程安全、推荐使用;Hashtable 不允许 null、线程安全、是保留类不建议用。多线程场景下用 ConcurrentHashMap 替代,这是原文第 21 题和第 30 题都提到的点。
4. 新手用这份清单最容易踩的五个坑
4.1 坑一:把 208 道题当成必须全部背完的任务
现象:拿到文档后从第一题开始背,背到第三十题就泄气了,觉得内容太多根本背不完。原因:把面试题清单当成了考试大纲,误以为每道题都会被问到。解决:先按模块分优先级,Java 基础、多线程、集合、MySQL、Redis、Spring 这六块是初级面试的高频区,先吃透这几块;RabbitMQ、Kafka、Zookeeper 这类中间件在初级岗位里问得浅,能说出“是什么、用来解决什么问题”就行。原文十八个模块的排列顺序本身就可以作为优先级参考,越靠前的模块在初级面试里出现频率越高。
4.2 坑二:只看答案不跑代码,以为自己懂了
现象:看“== 和 equals”的答案觉得很简单,面试时被追问“两个对象的 hashCode 相同,equals 一定为 true 吗”就答不上来。原因:看答案是被动接收,跑代码是主动验证,两者对记忆的巩固程度差很多。解决:凡是原文里带代码示例的题,都把代码复制到本地跑一遍,改改变量值看输出怎么变。比如原文第 3 题用“通话”和“重地”两个字符串演示 hashCode 相同但 equals 为 false,你亲手跑一遍,这个反直觉的例子就记住了。原文里带代码的题集中在 Java 基础和多线程模块,这两块正好是高频区,跑代码的投入产出比很高。
4.3 坑三:忽略“区别类”题目的答题结构
现象:被问“抽象类和接口有什么区别”,东一句西一句说了半分钟,面试官表情越来越淡。原因:这类题有固定的答题维度,新手不知道按维度组织语言。解决:区别类题目按“实现方式、构造函数、实现数量、访问修饰符”四个维度答,这是原文第 14 题给出的结构。类似的,“sleep 和 wait 的区别”按“所属类、是否释放锁、用法”三个维度答,“ArrayList 和 LinkedList 的区别”按“数据结构、随机访问效率、增删效率”三个维度答。你可以在过题的时候,把每道区别类题目的答题维度写在旁边,形成肌肉记忆。
4.4 坑四:死记结论不理解场景,被追问就露馅
现象:记住了“单线程用 StringBuilder,多线程用 StringBuffer”,被问“为什么 StringBuilder 性能更高”就答不上来。原因:只记了结论,没理解结论背后的原因。解决:每记一个结论,多问一句“为什么”。StringBuilder 性能高是因为它不是线程安全的,没有加同步锁的开销;StringBuffer 线程安全是因为方法上加了 synchronized。理解了这一层,再被问“那 String 为什么不适合频繁修改字符串”,你就能答出“String 是不可变对象,每次操作都生成新对象”。原文第 7 题把这三个类的区别讲得很清楚,过题的时候多停留两分钟,把因果链理出来。
4.5 坑五:面试前一周才开始看,时间全花在焦虑上
现象:投了简历才开始翻这份清单,发现两百多道题根本看不完,越看越慌。原因:面试题清单是复习材料,不是速成材料,临时抱佛脚只能记住零散结论。解决:至少提前三到四周开始过,第一周过 Java 基础和多线程,第二周过集合、异常、IO 和 MySQL,第三周过 Spring 和 Redis,第四周只复习标记出来的错题和高频题。每天投入一到两小时就够,关键是持续。这份清单的 208 道题按四周分配,平均每天不到十道,压力并不大,怕的是拖到最后一周。
5. 过完这 208 道题之后:下一步学什么、怎么继续练
过完这份清单,你已经对初级面试的提问范围有了底,但这只是起点,不是终点。下一步的学习路径建议按三条线走。第一条线是补项目经历:面试官问完基础题,一定会问“你做过什么项目”,这时候光有面试题答案不够,你需要一个能讲清楚的小项目。建议找一个带完整流程的练手项目,比如一个简单的后台管理系统,把 Spring Boot、MySQL、Redis 串起来用一遍,哪怕功能很简单,只要能说清楚“我用了什么、为什么这么选、遇到什么问题怎么解决”,就比空谈概念强。第二条线是刷算法题:初级面试的算法题不会太难,但数组、字符串、链表的常见操作要熟练,每天刷两道,坚持一个月,手感就出来了。第三条线是补计算机基础:操作系统、计算机网络、数据库原理这三门课的知识在面试里会以“TCP 三次握手”“索引为什么用 B+ 树”这类形式出现,不需要学得多深,但基本概念要有。
具体到这份清单的使用,过完第一轮之后,建议把每道题的答案用自己的话重新写一遍,写不出来的就是没掌握的。第二轮只过错题,第三轮面试前三天快速扫一遍高频题。我自己的习惯是,每次面试前把 Java 基础和多线程两个模块的题快速过一遍,重点看那些“区别类”和“原理类”的题,因为这两类题最容易在面试现场卡壳。从那以后我每次准备面试,都会先把清单里的题按“能脱口而出”“要想一下”“完全不会”三档分类,只花时间在第二档和第三档上,第一档的题扫一眼就过。这个习惯帮我省了不少时间,也避免了在已经会的题上反复消耗。希望这份清单也能帮你把面试的底气一点点攒起来,从第一道 JDK 和 JRE 的区别开始,一道一道过,别急。
本文还有配套的精品资源,点击获取