每年Java面试都有新花样但只要你盯过几轮招聘季就会发现翻来覆去问的还是那批基础题。2026年的Java基础面试题汇总方向上确实有些变化——项目经验问得更细场景题比重变大但底层基础依然是筛人的第一关。我在日常辅导和面试复盘里反复看到挂掉的人往往不是不会写代码而是基础概念一说就含糊比如HashMap扩容时红黑树怎么退化ClassLoader为什么要双亲委派线程池核心线程数到底怎么定。这篇汇总按我的实际经验整理覆盖Java语言基础、集合框架、JVM、并发、常用框架以及手写算法几个核心板块每个考点都配有考察意图、回答要点和容易踩的坑。无论是准备校招、跳槽还是临时抱佛脚按这个清单过一轮心里会踏实很多。1. 2026年面试导向基础题为什么依然是分水岭1.1 面试考核逻辑的三个明显变化先说结论2026年的Java基础面试已经不是背概念就能混过去的了。我观察到的第一个变化是场景题大幅增加。以前问ArrayList和LinkedList区别现在大概率换一种问法一个高频读取、偶发删除的列表你选哪个为什么本质上还是考数据结构但你得把时间复杂度、内存布局、迭代器失效这些细节串起来讲。第二个变化是源码深挖常态化。HashMap、ConcurrentHashMap、ArrayList的源码几乎成了必问项而且会连环追问。你答了HashMap默认负载因子0.75面试官立刻跟进为什么是0.75扩容时为什么是2倍答不上来之前的印象分就打了折扣。这不是刁难而是判断你平时有没有真的读代码。第三个变化是基础题与项目经历强绑定。面完基础面试官会问你们项目里哪里用到了线程池核心参数怎么设的如果你只是背了七参数但说不清业务场景等于白搭。所以这篇汇总里我不光给答案还尽量把场景讲透。1.2 高效准备策略别再用背题思维复习既然考察方式变了准备方法也得变。我强烈建议按概念原理场景三层结构去复习每个考点。比如String不可变性先记住结论final类、不可变字符序列再理解原理char数组被final修饰、每次修改都产生新对象最后能举出场景作为HashMap的key很安全、字符串常量池的复用价值。另一个高效做法是画脑图做减法。别把网上几百道题全背了把高频考点压缩成十几张卡片。我常用的方式是每张卡片正面写考点反面写回答要点一句话场景碎片时间反复过。千万别陷入我全都要背下来的焦虑面试官其实只关心你对核心概念的掌握深度和表达逻辑。2. Java语言基础从数据类型到面向对象2.1 数据类型与包装类自动装箱的陷阱基础到不能再基础但失分率极高。首先要明确Java是强类型语言基本类型分四类八种整型byte/short/int/long、浮点型float/double、字符型char、布尔型boolean。面试常常绕不开的是范围问题比如int的取值范围为什么是-2^31到2^31-1其实就是补码表示最高位是符号位。包装类部分必问两个点自动装箱和缓存机制。自动装箱用的是valueOf缓存机制典型的是Integer cache——-128~127之间会走缓存超过这个范围就new新对象。所以Integer a 127; Integer b 127; a b是true但换成128就是false。这个坑几乎每年都有人踩建议回答时直接点出比较值用equals比较引用才用。浮点数精度也是高频点。0.1 0.2 ! 0.3这种问题不难关键是要答出IEEE 754浮点数表示原理然后给出应对方案用BigDecimal并指定精度或者用整数类型存分。实际项目中涉及金额计算我的原则是绝对不用浮点。2.2 String、StringBuilder与StringBuffer三者的选择逻辑String不可变是必背结论但光说final类不够。我一般会拆三层讲第一层是String类用final char[]JDK9以后是byte[]存储类本身也被final修饰第二层是字符串常量池的复用机制声明字符串字面量时先去池里找找不到才创建第三层是不可变带来的安全性和线程安全比如网络传参、数据库URL这些场景不可变可以防止被篡改同时天然线程安全可以作为HashMap的key。StringBuilder和StringBuffer的区别一句话就能说清前者非线程安全、效率高后者加了synchronized、线程安全但慢。面试官常追问字符串拼接用还是StringBuilder实际上javac编译器在大多数情况下会把优化成StringBuilder但循环内拼接仍然存在频繁创建新对象的问题。更严谨的回答是看场景少量拼接用没问题循环或复杂拼接建议显式用StringBuilder且指定初始容量减少扩容开销。2.3 面向对象三大特性与设计原则的考核重点封装、继承、多态这三大特性问的人多答得好的人少。封装的核心是信息隐藏通过访问修饰符控制可见性继承要答出is-a关系、方法重写规则访问权限不能变小、参数列表必须一致多态则是编译看左边运行看右边靠的是父类引用指向子类对象底层依赖虚方法表。今年面试我明显感觉设计原则问得更细了尤其是单一职责原则和开闭原则。面试官喜欢给一个小案例一个订单类又要处理计算、又要处理存储、又要发送通知你怎么改参考答案很简单拆开——订单计算类、订单存储类、通知服务类。回答时最好带一句设计原则不是教条而是为了应对需求变化拆完之后每个类的改动彼此独立。这样既显深度又贴近实战。3. 集合框架源码级理解的必考题3.1 ArrayList与LinkedList不只是数组vs链表常规答案谁都会ArrayList底层是Object数组查询快、增删慢LinkedList底层是双向链表增删快、查询慢。但2026年这么答已经不够用了。至少要补充几个进阶维度。ArrayList要注意扩容机制默认容量10每次扩容为原来的1.5倍oldCapacity (oldCapacity 1)然后通过Arrays.copyOf拷贝。如果预先知道数据量建议用带初始容量的构造器减少扩容拷贝次数。删除元素时要理解System.arraycopy的移动逻辑以及modCount和fail-fast机制——迭代过程中如果集合结构被修改会抛出ConcurrentModificationException。LinkedList的优势我想强调队列和栈场景它实现了Deque接口可以做双端队列使用。但要说增删快得区分情况——如果删的是中间位置元素先要遍历找到该位置这一步是O(n)只有在头部尾部操作才是O(1)。所以LinkedList增删快其实是片面结论面试时如果能主动点破这个细节会显得你确实读过源码。3.2 HashMap底层实现与扩容今年最硬核的考点HashMap是Java面试题里的常青树几乎场场都考。回答的主线应该是数组链表红黑树的结构演进。JDK1.7是数组链表头插法JDK1.8改成尾插法链表长度超过阈值8且数组长度超过64时链表转红黑树。要解释为什么转树极端哈希冲突下链表查询退化为O(n)红黑树能把查询降到O(log n)。扩容机制也必须讲透。默认初始容量16负载因子0.75。扩容发生在size thresholdthreshold capacity * loadFactor。扩容时容量变为原来的两倍元素需要重新计算桶位。为什么不直接用hashCode而是先高16位异或低16位这是为了扰动让高位信息也参与低位的哈希计算减少碰撞概率。为什么容量是2的幂次因为(length - 1) hash对于2的幂次等价于取模而且位运算更高效。再往深了问就是为什么负载因子是0.75。这是个平衡点太小浪费空间太大哈希冲突概率上升。0.75是空间和时间成本的折中数学推导有泊松分布的解释简单说就是经验值统计学支撑。3.3 线程安全集合与ConcurrentHashMap的演进Java基础面试有一个常见转向HashMap说完了面试官会问那并发场景怎么办备选答案有Hashtable、Collections.synchronizedMap、ConcurrentHashMap。前两者都是全表加锁并发度低实际项目中被ConcurrentHashMap替代。ConcurrentHashMap的重点在JDK1.8后的结构放弃了分段锁改用CAS synchronized锁单个桶的头节点。put流程大概是计算hash找到桶位如果桶为空用CAS直接写入如果桶位不为空synchronized锁住头节点后再写入链表或红黑树。读取时不加锁靠volatile修饰节点数组保证可见性。理解到这个层面面试基本稳了。顺便把CopyOnWriteArrayList也复习一下读多写少场景适用写时复制整个数组读不加锁但写开销大。面试官比较吃这种知道每个集合适用场景的回答方式。4. JVM基础运行时数据区与垃圾回收4.1 运行时数据区从内存划分到对象创建过程JVM基础题不会太偏但运行时数据区一定要能完整说出来。程序计数器是当前线程执行字节码的行号指示器Java虚拟机栈每执行一个方法就创建一个栈帧栈帧里有局部变量表、操作数栈、动态链接、方法出口本地方法栈服务于native方法堆是对象实例分配的主要区域方法区存类元信息JDK8以后以元空间实现。对象创建过程也是一个经典题类加载检查、分配内存、初始化零值、设置对象头、执行init方法。要注意的是内存分配方式有指针碰撞和空闲列表两种取决于堆是否规整而堆是否规整又取决于GC算法是否带压缩整理。这里能答出TLAB线程本地分配缓冲减少并发竞争的话会加分不少。4.2 垃圾回收判断算法、收集器与GC参数判断对象是否存活答案是可达性分析从GC Roots出发一路找引用链。需要说出哪些是GC Roots虚拟机栈中引用的对象、静态属性引用的对象、常量引用的对象、JNI引用的对象等。Reference counting虽然简单但无法解决循环引用所以主流JVM不采用。垃圾收集器按分代收集思路组织新生代用复制算法常见的有ParNew、Parallel Scavenge老年代用标记-整理或标记-清除常见有CMS、G1。现在G1成了面试重点要能说出它的Region化内存布局、RSet维护、可预测停顿时间模型通过-XX:MaxGCPauseMillis设置目标停顿。ZGC和Shenandoah属于超低延迟方向至少知道名字和设计理念。回答GC问题时多说一句收集器选择本质是根据应用场景平衡吞吐量和停顿时间会显得你理解到位。4.3 类加载机制双亲委派模型及其价值类加载机制是个特别能体现深度的考点。加载流程要分为加载、验证、准备、解析、初始化其中准备阶段会为静态变量分配内存并设置零值初始化阶段执行clinit。类加载器则有Bootstrap、ExtensionJDK9后叫Platform、Application三层双亲委派模型说的是收到类加载请求后先委托父加载器加载父加载器处理不了才自己加载。为什么要双亲委派防止核心类库被篡改比如你自定义一个java.lang.String如果不委派系统里会出现多个String类导致混乱。不过偶尔会遇到为什么要打破双亲委派的问题典型场景是Tomcat的web应用隔离、SPI机制如JDBC驱动加载可以通过Thread.currentThread().getContextClassLoader()打破。讲清楚这个就够用了。5. 并发编程基础从锁原理到线程池5.1 线程生命周期与synchronized的锁升级线程生命周期建议背成三张图新建、可运行、阻塞/等待/超时等待、终止。重点不是背状态名而是说清状态切换的条件比如wait()和sleep()的区别一个释放锁、一个不释放锁notify()只能唤醒同一个监视器对象上等待的单个线程。synchronized作为最基础的同步手段JDK1.6之后有了锁升级路线无锁→偏向锁→轻量级锁→重量级锁。偏向锁是同一个线程反复获取锁时消除CAS成本轻量级锁用自旋避免线程阻塞竞争激烈时升级为重量级锁依赖操作系统互斥量。问到为什么需要锁升级核心目的是让锁成本适应竞争的激烈程度尽量避免昂贵的线程挂起和恢复。5.2 volatile与可见性、有序性、原子性volatile必考而且经常和synchronized对比。volatile解决两件事可见性写线程修改值后其他线程立即可见和有序性禁止指令重排序通过插入内存屏障实现。它不解决原子性比如count这种复合操作仍然不安全因为包含读取、加一、写回三步。面试官常问什么时候用volatile。实际例子状态标志位、双重检查锁定单例模式中实例字段。单例那里有个小坑变量需要用volatile修饰否则因为指令重排序可能返回一个没有完成初始化的对象。每次答到这里我都会补一句这是面试官最爱埋的伏笔。5.3 线程池七个参数与任务拒绝策略线程池几乎是必考。核心问题ThreadPoolExecutor七个参数分别是什么。corePoolSize、maximumPoolSize、keepAliveTime、unit、workQueue、threadFactory、handler。然后要能说出执行流程核心线程满→放入工作队列→队列满→创建非核心线程→线程数达最大值→执行拒绝策略。拒绝策略有四种AbortPolicy抛异常、CallerRunsPolicy调用者线程执行、DiscardPolicy静默丢弃、DiscardOldestPolicy丢弃最老任务。我最推荐理解的是CallerRunsPolicy因为它在拒绝时不会丢任务只是把压力反馈给调用方比较适合对任务丢失敏感的业务。核心参数怎么定网上公式很多但实际经验是结合任务的类型CPU密集、IO密集、混合型。CPU密集型设N 1IO密集型设2N左右其中N是CPU核数。面试回答时建议带上线上压测调优这个关键词别只背公式。OOM的问题也值得提Executors.newFixedThreadPool用的无限队列任务堆积可能导致内存溢出所以项目里我更倾向手动创建ThreadPoolExecutor。6. 常用框架基础与生态扩展6.1 Spring核心思想IOC与AOPJava基础面试早就不局限于纯Java语法Spring框架问题基本成了标配。IOC控制反转的核心是把对象创建和依赖管理的控制权从程序员手里交给容器。回答时我会配合一句实际体会没有IOC时new对象、手动注入依赖、管理生命周期都要自己来代码耦合极重有了容器后对象之间的依赖在配置文件或注解里声明容器负责装配和销毁。AOP面向切面编程主要讲清楚动态代理基于接口的JDK动态代理和基于类的CGLIB代理。事务管理是AOP最重要的应用之一Spring的声明式事务如何保证方法内异常时回滚核心在于事务通知通过代理拦截方法调用。这里常见坑是同一个类内部调用另一个方法Transactional会失效因为走的是this调用而不是代理对象。能说出这个坑面试官基本认可你有实战经验。6.2 MyBatis基础Mapper、#{}与${}的区别MyBatis面试题这两年热度很高最经典的就是#{}和${}的区别。#{}是预编译通过PreparedStatement占位符传值能有效防止SQL注入${}是直接字符串拼接适合动态列名、表名等不能参数化的场景但有SQL注入风险。实际项目中能用#{}就尽量用动态表名场景需要对传入值做白名单校验。再延伸一下就是一级缓存和二级缓存。一级缓存是SqlSession级别的默认开启但SqlSession关闭就失效二级缓存是namespace级别的需要手动开启。面试常问为什么不推荐长期依赖MyBatis缓存原因很现实缓存失效控制复杂、分布式环境下一致性难保证业务上更多依赖Redis这类分布式缓存。6.3 中间件基础Redis与消息队列的常见追问虽然不是纯Java基础但Java岗位面试几乎必带几个中间件问题。Redis常问数据结构String、Hash、List、Set、ZSet、持久化方式RDB快照和AOF日志、缓存淘汰策略LRU/LFU等、缓存穿透/击穿/雪崩的区别和应对方案。我记得有个记忆技巧穿透是查一个不存在的数据击穿是一个热点key过期瞬间大量请求打到DB雪崩是大量key同时过期。应对方案分别是布隆过滤器/空值缓存、互斥锁/逻辑过期、加随机过期时间/多级缓存。Kafka这类消息队列的常见题包括如何保证消息不丢失、如何保证顺序性、重复消费问题怎么处理幂等。回答时核心是讲清Producer端确认、Broker端副本、Consumer端手动提交位移的组合方案。这部分如果没接触过实际项目至少要把概念框架理清别一问就知道名词、但是与场景对不上。7. 手写算法与代码能力测试7.1 排序算法不背代码理解后再动手面试里手写排序算法常用的是冒泡排序、快速排序和归并排序。以冒泡排序为例核心代码不复杂但面试官会问时间复杂度、稳定性、以及如何优化比如加标志位判断是否已经有序。我见过不少候选人写对了代码却说不清为什么外层循环要n-1趟这类基础概念的追问往往比代码本身更能刷人。public static void bubbleSort(int[] arr) { if (arr null || arr.length 2) return; for (int i 0; i arr.length - 1; i) { boolean swapped false; for (int j 0; j arr.length - 1 - i; j) { if (arr[j] arr[j 1]) { int tmp arr[j]; arr[j] arr[j 1]; arr[j 1] tmp; swapped true; } } // 某一趟没有发生交换说明已经有序提前结束 if (!swapped) break; } }快速排序是面试高频中的高频。它的核心是分区选一个基准值把比它小的放左边、比它大的放右边然后递归处理左右区间。面试时我会建议顺带说一句快排是原地排序平均时间复杂度O(n log n)最坏退化为O(n^2)优化可以用随机基准或三数取中。归并排序则要强调分治合并稳定但需要O(n)额外空间特别适合说明稳定性考点。7.2 常考手写题二分查找、反转链表与单例模式二分查找的代码不难但边界条件是重灾区。面试官特别爱观察你用的是左闭右闭还是左闭右开。我习惯用左闭右闭写法public static int binarySearch(int[] arr, int target) { int left 0, right arr.length - 1; while (left right) { int mid left ((right - left) 1); if (arr[mid] target) { return mid; } else if (arr[mid] target) { left mid 1; } else { right mid - 1; } } return -1; }注意mid的写法为什么要用left ((right - left) 1)一是防止left right溢出二是移位操作比除法更高效。这种细节主动说出来面试官会立刻感受到你平时写代码的习惯。反转链表算链表题的基本功用迭代法或者递归法都行建议两种都会且能比较区别。单例模式的手写也很常见重点看双重检查锁定写法里volatile的存在意义这部分和前文并发考点呼应上了。如果再问枚举实现单例有什么好处答出线程安全、可序列化、反射攻击免疫就是满分答案。8. 常见问题与排查技巧实录8.1 面试中容易失分的细节清单我梳理了一张高频失分点速查表建议对照自测考点错误回答正确姿势Integer比较用比较两个Integer区分-128~127缓存区值比较用equals字符串拼接直接用性能差少量拼接无妨循环内用StringBuilder并指定容量HashMap只答数组链表补充红黑树转换条件、扩容负载因子0.75、扰动函数多态只背父类引用指向子类结合虚方法表、方法重写规则线程池只报七个参数名称说清执行流程、拒绝策略、场景参数设置事务失效不知道内部调用会失效点出this调用走代理问题MyBatis说不清#{}与${}预编译防注入、动态场景白名单二分查找边界死循环或漏判左闭右闭条件left right避免溢出8.2 几类现场翻车场景与心理调整实际面试中翻车往往不是因为不会而是因为紧张导致答非所问。一个经典场景是面试官问你说说HashMap的put过程候选人上来就背源码从hash方法讲到treeifyBin结果被一句我只问put过程你重点说清楚链表插入和扩容就行打断。我的建议是听清问题的限定范围先给出主线索再根据追问展开细节不要一口气全倒出来。另一个高频问题是你还有什么想问的。这时候不要问加班严重吗薪资多少建议问技术相关的问题比如团队现在用的技术栈里哪些组件维护成本比较高这个岗位对新人的培养路径是怎么安排的。这既显示热情也能真正帮你判断团队是否适合你。心态上我一直觉得面试是一个信息交换的过程不全是被审判。你也在评估这家公司和这个岗位抱着这种心态表达会自然很多。8.3 持续更新与复习节奏的建议这篇2026年Java基础面试题汇总我会持续更新每次面试新增的、有价值的追问都会沉淀进来。从复习节奏上说校招建议提前3个月准备前一个半月过基础考点中间一个月刷题和复盘项目最后半个月集中做模拟面试。跳槽的话重点是基础项目穿插复习别因为平时在写业务代码就忽略基础知识。我自己体验下来最有效的复习方式是输出式复习每复习一个知识点尝试不看书自己用白板讲一遍甚至写一篇简短的技术笔记。讲不清楚的地方往往就是你的知识盲区。这个习惯帮我扛住了不少突击面试。现在这个汇总版本只是一个起点后续我还会补充更多实战细节比如在线排查技巧、框架底层原理加分回答、大厂场景题拆解等。保持关注持续迭代祝大家都能在面试里发挥出真实的水平。