Java初级面试208题:四类核心考点与追问链答题技巧 简介这是一份面向Java初学者与应届培训生的面试复习文档围绕初级岗位常见考点整理出208道试题并附参考答案帮助缺乏项目经验的求职者快速建立知识框架、应对技术面试。资源为单个docx文件压缩包约155KB内容按十八个模块编排涵盖Java基础、多线程、反射、对象拷贝、JavaWeb、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/SpringCloud、Hibernate、MyBatis、RabbitMQ、Kafka、Zookeeper、MySQL、Redis与JVM等方向。其中Java基础部分对JDK与JRE的区别、与equals的差异、hashCode与equals的关系、final关键字作用、Math.round取值规则等高频题给出了代码示例与逐行解读便于理解底层原理。目前已有620人学习适合作为面试前的速查清单与知识点查漏补缺之用。1. 初级 Java 岗面试208 道题里真正拉开差距的只有这四类初级 Java 面试有个反直觉的地方面试官手里那张题库和你背的那份往往不是同一套。你背了 208 道他可能只问 12 道但这 12 道里有一半会顺着你的回答往下追。真正拉开差距的不是你背了多少而是你能不能在被追问时稳住。这份 Java 初级面试题汇总按十八个模块拆开从 Java 基础、多线程、反射、对象拷贝一路铺到 JavaWeb、异常、网络、设计模式再到 Spring/Spring MVC、Spring Boot/SpringCloud、Hibernate、MyBatis、RabbitMQ、Kafka、Zookeeper、MySQL、Redis、JVM一共 208 道。它面向的是刚从学校出来或者刚培训出来的 Java 人员所以题目难度压在初级区间但覆盖面铺得很宽。问题也在这里覆盖面宽不等于每道都要背到一字不差。初级岗面试的评分逻辑是「基础题不能错进阶题能说个大概场景题能接住追问」。下面按考点分布、高频模块、易错点、答题技巧四层往下拆你照着练就行。2. 考点分布十八个模块里哪几个决定你能不能过2.1 先看清分值地图别把时间平摊十八个模块听起来吓人但初级岗面试的时间分配极不均匀。按实际面试出现频率排Java 基础、多线程、集合、异常这四块能占到一半以上的提问量Spring/Spring MVC、MySQL、Redis 再占掉两成剩下的反射、对象拷贝、JavaWeb、网络、设计模式、消息队列、Zookeeper、JVM 属于「问到就答答不上来不致命」的区间。所以备考顺序不是从模块一背到模块十八而是先把 Java 基础和多线程吃透再补 Spring 和数据库最后扫一遍边角模块。下面这张表帮你判断每个模块该投入多少精力。模块面试出现频率建议投入典型问法Java 基础极高精背 能写代码 和 equals、String 类、抽象类与接口多线程极高精背 理解原理线程创建、线程池、synchronized、死锁集合高精背 对比记忆HashMap 原理、ArrayList 与 LinkedList异常高理解分类受检与非受检、try-catch-finallySpring/Spring MVC高理解流程IOC、AOP、请求处理流程MySQL高理解 会写 SQL索引、事务、锁Redis中高理解场景数据类型、缓存穿透、持久化反射、对象拷贝中知道概念反射机制、浅拷贝与深拷贝JavaWeb、网络中知道概念HTTP、TCP、Servlet 生命周期设计模式中记住几个常用的单例、工厂、代理消息队列、Zookeeper低知道用途解耦、削峰、分布式协调JVM中理解内存结构内存区域、GC、类加载这张表的意思是如果你的准备时间只有两周前四行必须滚瓜烂熟中间几行能说出关键词最后几行知道它是干什么的就行。面试官不会因为你说不清 Zookeeper 的选举算法就否定你但会因为你说错 HashMap 的扩容机制而皱眉。2.2 真题演练基础模块的三道必考题题一JDK 和 JRE 有什么区别这题看着简单但很多人答得含糊。答题思路是分三层说第一层说全称和定位JDK 是 Java Development Kit开发工具包提供开发和运行环境JRE 是 Java Runtime Environment运行环境只负责运行。第二层说包含关系JDK 里面包含了 JRE同时还带了编译器 javac 以及一堆调试分析工具。第三层落到使用场景只运行 Java 程序装 JRE 就够要写 Java 程序必须装 JDK。面试官最想听的是第三层因为前两层谁都会背能说清「什么时候用哪个」才说明你真理解。题二 和 equals 的区别是什么这题必须分基本类型和引用类型说混在一起说就是翻车现场。基本类型用 比较的是值是否相同引用类型用 比较的是引用是否指向同一个对象。equals 默认情况下就是 但 String、Integer 这些类重写了 equals把它变成了值比较。能配上代码说更好String x string; String y string; String z new String(string); System.out.println(x y); // true指向常量池同一引用 System.out.println(x z); // falsenew 开辟了新堆内存 System.out.println(x.equals(y)); // true值相同 System.out.println(x.equals(z)); // true值相同代码后面的解读要跟上x 和 y 都指向常量池里的同一个对象所以 为 truez 通过 new 在堆上开了新空间引用不同所以 为 falseequals 被 String 重写成值比较所以两个都是 true。这段代码加解读基本能拿满分。题三两个对象的 hashCode() 相同equals() 也一定为 true 吗答案是「不一定」。这题考的是你对散列表的理解。hashCode 相同只说明两个键值对的哈希值相等但哈希值相等不代表对象相等。经典例子是「通话」和「重地」这两个字符串它们的 hashCode 都是 1179395但 equals 返回 false。答题时补一句反过来如果 equals 为 truehashCode 一定相同这是重写 equals 时必须遵守的约定。能说出这个反向约定面试官会觉得你基础扎实。3. 多线程高频考点线程池、锁升级、死锁三道硬菜3.1 线程池七种创建方式核心只有一种多线程模块里线程池是必问的。这份题库列了七种创建方式newSingleThreadExecutor、newCachedThreadPool、newFixedThreadPool、newSingleThreadScheduledExecutor、newScheduledThreadPool、newWorkStealingPool以及最原始的 ThreadPoolExecutor。前六种都是对 ThreadPoolExecutor 的封装所以答题时先说这句再展开各自特点。newSingleThreadExecutor 工作线程数为 1保证任务顺序执行newCachedThreadPool 处理大量短时任务线程闲置超过 60 秒就回收内部用 SynchronousQueuenewFixedThreadPool 固定线程数超出任务在无界队列等待newScheduledThreadPool 支持定时和周期调度newWorkStealingPool 是 Java 8 加入的内部构建 ForkJoinPool用 Work-Stealing 算法并行处理不保证顺序。面试官追问「为什么阿里规范不建议用 Executors 创建线程池」你要能接住newFixedThreadPool 和 newSingleThreadExecutor 用的是无界队列任务堆积可能撑爆内存newCachedThreadPool 最大线程数是 Integer.MAX_VALUE可能创建过多线程。所以生产环境推荐直接 new ThreadPoolExecutor自己指定核心参数。3.2 真题演练synchronized 锁升级和死锁题一synchronized 锁升级的原理是什么这题属于多线程里的进阶题初级岗问到就算加分。答题思路按「对象头 → 偏向锁 → 轻量级锁 → 重量级锁」的顺序说。锁对象的对象头里有个 threadid 字段。第一次访问时 threadid 为空JVM 让它持有偏向锁并把 threadid 设为该线程 id。再次进入时先判断 threadid 是否一致一致就直接用不一致就把偏向锁升级为轻量级锁通过自旋循环一定次数获取锁。自旋若干次还没拿到就升级为重量级锁。最后补一句锁升级的目的Java 6 之后用这种方式优化 synchronized降低锁带来的性能消耗。这句话是得分点说明你知道「为什么要有锁升级」。题二什么是死锁怎么防止死锁死锁的定义要说得具体线程 A 持有独占锁 a尝试获取独占锁 b线程 B 持有独占锁 b尝试获取独占锁 a双方互相持有对方需要的锁形成阻塞这就是死锁。防止死锁的方法题库给了四条用 tryLock 设置超时时间超时退出用 java.util.concurrent 并发类代替手写锁降低锁的使用粒度不要几个功能共用一把锁减少同步代码块的范围。答题时可以把这四条归纳成两个方向一是破坏「请求与保持」条件用超时机制二是破坏「循环等待」条件降低锁粒度、避免嵌套加锁。能归纳出方向比单纯背四条更有说服力。3.3 真题演练sleep 和 wait、run 和 start题一sleep() 和 wait() 有什么区别三个维度说清楚。类的不同sleep 来自 Threadwait 来自 Object。释放锁sleep 不释放锁wait 释放锁。用法不同sleep 时间到自动恢复wait 需要用 notify 或 notifyAll 唤醒。这题最容易错的是「释放锁」这一条很多人记反。记住一个口诀wait 是等别人叫醒所以得先把锁让出来sleep 是睡一会儿锁还攥在手里。题二线程的 run() 和 start() 有什么区别start() 用于启动线程run() 用于执行线程的运行时代码。run() 可以重复调用start() 只能调用一次。追问「为什么 start 只能调一次」答调用 start 后线程进入就绪状态再由 JVM 调度执行 run重复调用会抛 IllegalThreadStateException。4. 集合与 Spring 模块HashMap 原理和 IOC 是两道分水岭4.1 HashMap 实现原理答到红黑树才算完整HashMap 是集合模块的核心考点。答题按「put 流程 → hash 冲突 → 链表转红黑树」的顺序说。通过 put(key, value) 存储get(key) 获取。传入 key 时HashMap 根据 key.hashCode() 计算 hash 值根据 hash 值把 value 存到 bucket 里。hash 值相同时叫 hash 冲突HashMap 用链表和红黑树存储相同 hash 值的 value。冲突个数少时用链表多时用红黑树。面试官可能追问「链表转红黑树的阈值是多少」答 8「红黑树转回链表的阈值」答 6。这两个数字能说出来说明你不是只背了概念。配套的对比题也要准备HashMap 和 Hashtable 的区别存储上 HashMap 允许 key 和 value 为 nullHashtable 不允许线程安全上 Hashtable 安全HashMap 不安全推荐使用上Hashtable 是保留类不建议用单线程用 HashMap多线程用 ConcurrentHashMap。4.2 真题演练ArrayList 与 LinkedList、Iterator题一ArrayList 和 LinkedList 的区别是什么从三个维度答。数据结构ArrayList 是动态数组LinkedList 是双向链表。随机访问ArrayList 效率高LinkedList 要移动指针从头找。增删效率非首尾的增删LinkedList 比 ArrayList 高因为 ArrayList 增删要影响数组内其他元素的下标。最后给结论频繁读取用 ArrayList插入删除多用 LinkedList。这个结论是面试官想听的落地判断。题二Iterator 怎么使用有什么特点先给代码ListString list new ArrayList(); IteratorString it list.iterator(); while (it.hasNext()) { String obj it.next(); System.out.println(obj); }然后说特点Iterator 更安全因为当前遍历的集合元素被更改时会抛 ConcurrentModificationException。追问「为什么用 Iterator 遍历时删除元素会抛异常」答Iterator 内部维护了一个 modCount集合结构变化时 modCount 改变Iterator 检查到不一致就抛异常。正确做法是用 Iterator 自己的 remove 方法。4.3 Spring 模块IOC 和 AOP 要能举例Spring/Spring MVC 是初级岗的高频模块。IOC 和 AOP 两个概念必须能说清楚还要能举例子。IOC 是控制反转把对象的创建和依赖管理交给容器你不需要自己 new 对象容器帮你注入。举例Service 里需要 Dao不用自己 new DaoImpl加个注解容器就注入了。AOP 是面向切面编程把日志、事务这些横切逻辑从业务代码里抽出来通过代理在方法前后织入。举例事务管理不用在每个方法里写开启和提交事务加个注解就行。Spring MVC 的请求处理流程也常问请求到 DispatcherServlet它查 HandlerMapping 找到对应 ControllerController 处理完返回 ModelAndViewViewResolver 解析视图最后渲染返回。这个流程能按顺序说下来就行不用背类名全称。5. 易错点这五道题初级岗最容易答错5.1 错在哪Math.round(-1.5) 答成 -2很多人按「四舍五入」的直觉答 -2实际答案是 -1。错在没理解 round 的规则数轴上取值时中间值 0.5 向右取整所以正 0.5 往上取整负 0.5 直接舍弃。正确答法是先说答案 -1再解释「向右取整」这个规则。这题考的是你有没有真的跑过代码而不是凭感觉。5.2 错在哪抽象类必须有抽象方法很多人以为抽象类里必须有抽象方法实际不需要。抽象类可以一个抽象方法都没有照样正常运行。错在把「抽象类」和「有抽象方法」画了等号。正确答法抽象类不一定有抽象方法但有抽象方法的类一定是抽象类。再补一句 final 不能修饰抽象类因为抽象类就是用来被继承的final 让它不能被继承两者矛盾。5.3 错在哪String 是基础数据类型String 不是基础类型。基础类型只有 8 种byte、boolean、char、short、int、float、long、double。String 是对象。这题错在概念混淆答错会显得基础不牢。正确答法直接说「String 不属于基础类型它是对象」然后把 8 种基础类型报一遍。5.4 错在哪poll() 和 remove() 答反Queue 里 poll() 和 remove() 都是返回第一个元素并删除区别在没元素时的行为poll() 返回 nullremove() 抛 NoSuchElementException。很多人记反或者只记得「都是删除」就说没区别。正确答法先说相同点再说不同点最后补一句「所以不确定队列是否为空时用 poll 更安全」。5.5 错在哪volatile 能保证原子性volatile 只保证可见性不保证原子性。synchronized 既保证可见性又保证原子性。这题错在把 volatile 的作用夸大了。正确答法volatile 是变量修饰符synchronized 修饰类、方法、代码段volatile 仅实现变量修改的可见性不能保证原子性volatile 不会造成线程阻塞synchronized 可能阻塞。三条对比说完再补一句「所以 i 这种复合操作用 volatile 修饰也不安全」。6. 答题技巧初级岗面试怎么把 208 道题用出最大效果6.1 背题不如背「追问链」208 道题如果一道一道背背到第 100 道前面的就忘了。更高效的做法是背「追问链」每道题准备两层追问。比如背 和 equals就要准备好「String 为什么重写 equals」「重写 equals 为什么必须重写 hashCode」「hashCode 相同 equals 一定相同吗」这三个追问。面试官问第一层你答完主动带一句「这里还涉及 hashCode 的约定」他就顺着问了而你已经准备好了。6.2 用「三层答题法」控制节奏每道题按三层答第一层给结论第二层说原因第三层举例子或说场景。比如问线程池创建方式第一层说「核心是 ThreadPoolExecutor其他六种都是它的封装」第二层说「各自的特点和适用场景」第三层说「生产环境推荐自己 new ThreadPoolExecutor因为 Executors 的默认队列可能撑爆内存」。三层答完就停不要一口气把所有知道的都倒出来。留空间给面试官追问追问是你展示深度的机会。6.3 代码题要能手写关键片段初级岗面试经常让你手写代码高频的有字符串反转、单例模式、生产者消费者、冒泡排序。字符串反转用 StringBuilder 的 reverse 方法StringBuilder sb new StringBuilder(); sb.append(abcdefg); System.out.println(sb.reverse()); // gfedcba单例模式写双重检查锁public class Singleton { private static volatile Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance null) { synchronized (Singleton.class) { if (instance null) { instance new Singleton(); } } } return instance; } }注意 volatile 不能省它防止指令重排导致其他线程拿到未初始化完的对象。这个点能说出来是加分项。6.4 押题思路把十八个模块压成三张纸最后一周不要再翻 208 道题把它压成三张纸。第一张写 Java 基础和多线程的核心概念对比比如 与 equals、sleep 与 wait、synchronized 与 Lock、ArrayList 与 LinkedList。第二张写框架和数据库的关键流程比如 Spring IOC、AOP、Spring MVC 请求流程、MySQL 索引和事务。第三张写边角模块的关键词比如反射的三种获取 Class 方式、浅拷贝与深拷贝、BIO/NIO/AIO 区别、设计模式的单例和工厂。三张纸过一遍能说出来的就过说不出来的标记出来重点看。面试前一天只看标记的。我当年第一次面初级岗把 208 道题从头背到尾结果面试官问「HashMap 扩容为什么是 2 倍」我卡住了因为题库里没写。从那以后我每次准备面试都强制走一遍「追问链」每道题至少准备两层追问答完第一层主动往第二层引。这个习惯让我后来再没在基础题上翻过车。希望帮到你。本文还有配套的精品资源点击获取