我是某大厂技术面官,这些年校招社招加起来面了不下八百人。快到2026年了,后台私信问我“Java面试到底准备啥”的人越来越多,今天就按我实际的面试习惯,把这两年最常问、也最能拉开差距的题梳理一遍。
先说个总体感受:2026年的Java面试,纯八股背诵已经吃不开了。面试官越来越喜欢追问“为什么”和“换一个场景怎么办”。HashMap源码背得滚瓜烂熟,但问一句“为什么链表转红黑树阈值是8”就卡住的人,我每周都能遇到好几个。反过来,如果你能顺着题目把底层原理、设计取舍、实际应用场景串起来讲,即便个别细节记错,我也愿意给高分——因为这说明你真正理解这行代码。
这篇文章的目标读者,是准备校招的应届生、想跳槽的初中级开发,以及打算往高级岗冲刺的同学。我会按面试中最常出现的模块来拆,每个模块给出高频题、追问方向和答题思路,最后附上我实际面试时最看重的几个点。内容尽量按2026年的趋势来写,但基础部分永远是那些东西,变的是问法和深度。
1. Java基础高频题:别再只会背八股
1.1 String、集合类那些“送分但不送命”的题
Java基础部分,面试官最爱从String和集合类切入。String这个类,看着简单,其实能挖出不少东西。
第一梯队必问题:String、StringBuilder、StringBuffer的区别。这道题几乎人人都会背“String不可变、StringBuilder线程不安全、StringBuffer线程安全”,但我要追问的是:String为什么设计成不可变?能答出“缓存hash值、字符串常量池复用、线程安全、安全敏感信息不易被篡改”这几层,才算过关。再往下还会问“字符串拼接用+和StringBuilder有什么区别”,这里要能说清楚JVM编译期对字符串拼接的优化,涉及javac字节码层面的优化,很多人会卡在这一层。
第二梯队是集合类的继承体系。面试官喜欢画个集合框架图让你填空,或者直接问“ArrayList和LinkedList的区别”。这道题不能只答数组和双向链表,要补充它们各自在插入、删除、随机访问时的实际性能差异,以及内存占用。ArrayList扩容机制也是高频考点,默认容量10、扩容1.5倍这个数字不能记错,要能讲清楚为什么扩容是1.5倍而不是2倍——这是基于最大避免空间浪费和减少数组复制次数的折中。
第三梯队是Java 8的Stream和Lambda。2026年这个时间节点,Java 8已经不算新了,但使用率依然最高,面试中经常问Lambda表达式的原理。很多人知道Lambda就是语法糖,但追问“Lambda表达式在JVM中是怎么实现的”就答不上来了。这里要能提到invokedynamic指令以及方法引用与Lambda的底层转换关系。还有Stream的惰性求值、中间操作和终端操作的区别,这些都需要结合项目中的实际使用场景来讲。
1.2 HashMap与ConcurrentHashMap:必考中的必考
HashMap是Java面试的“钉子户”,几乎每场必考。我从面试官角度说下提问路径:
先问基础:HashMap的底层数据结构。JDK 7是数组+链表,JDK 8是数组+链表+红黑树。这里要能画出结构图,说明链表转红黑树的条件、为什么是TREEIFY_THRESHOLD = 8。
接着追问:为什么链表转红黑树的阈值是8? 这是最经典的追问。要答出泊松分布:在负载因子0.75、随机hashcode的情况下,链表节点数达到8的概率约为千万分之六,也就是说链表长度到达8是小概率事件,用红黑树是兜底策略,防止极端情况下查询性能退化。同时要补充,红黑树节点是普通链表节点的两倍大,所以转换本身有成本,阈值定在8是为了在时间和空间上取得平衡。
再问:HashMap为什么是线程不安全的?要答出JDK 7并发扩容可能形成环形链表导致死循环,JDK 8虽然解决了死循环问题,但并发put仍可能导致数据覆盖。
最后问:ConcurrentHashMap的实现原理。JDK 7是分段锁设计,JDK 8抛弃分段锁,改用CAS + synchronized锁住数组的每个桶节点。这里要能解释为什么JDK 8选择synchronized而不是ReentrantLock——synchronized在JDK 8之后引入了偏向锁和轻量级锁优化,竞争不激烈时性能很好,且synchronized的代码更简洁,也符合“能不用锁就不用锁、能用轻量锁就不用重量锁”的原则。ConcurrentHashMap的size()方法、扩容时的协助扩容机制也是加分项。
提示:回答HashMap相关问题时,不要直接背源码。推荐按“数据结构 -> hash计算 -> put流程 -> get流程 -> 扩容 -> 并发问题”这条主线来组织,面试官跟着你的节奏走,你对场面的掌控感会强很多。
1.3 JVM内存与GC:OutOfMemoryError高频现场
JVM几乎是高级岗必问,初中级岗也越来越常考。热点词里有个“java: outofmemoryerror: insufficient memory”,这既是IDE报错,也是面试题引子。
基础题是JVM运行时数据区:程序计数器、虚拟机栈、本地方法栈、堆、方法区(元空间)。要能说出每个区域存放什么、什么情况下会报OutOfMemoryError。堆内存溢出对应java.lang.OutOfMemoryError: Java heap space,栈溢出对应StackOverflowError,元空间溢出会报Metaspace错误。
高频追问是JVM垃圾回收算法和垃圾收集器。标记-清除、标记-复制、标记-整理三种算法的优缺点要能讲清楚。新生代用复制算法(因为朝生夕灭的对象多),老年代用标记-清除或标记-整理。垃圾收集器要能讲G1,知道G1是区域化分代式收集器,通过维护优先列表实现可预测的停顿时间模型。2026年ZGC和Shenandoah也越来越常被问到,至少要知道ZGC是基于区域指针染色技术、几乎不产生停顿的收集器。
深挖题是如何分析OutOfMemoryError。这里要拿出真实操作经验:先加JVM参数-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path,让JVM在OOM时自动导出堆快照,然后用MAT或VisualVM分析Dominator Tree,找出占用内存最大的对象,定位到业务代码问题。这类问题结合你真实排查过的案例来回答,效果远好于背概念。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 并发编程:2026面试的重头戏
2.1 synchronized与锁升级机制
并发编程是Java面试中区分度最高的部分。问法通常很直接:synchronized的底层实现原理是什么?
回答要点:synchronized在JDK 6之后做了大量优化,引入了偏向锁、轻量级锁、重量级锁的升级机制。这里要能讲清楚锁的升级过程:一个对象刚开始没有锁竞争,偏向锁会记录持有锁的线程ID;一旦有其他线程来竞争,偏向锁撤销并升级为轻量级锁(通过CAS自旋获取锁);如果自旋超过阈值或竞争激烈,膨胀为重量级锁(依赖操作系统的互斥量实现,涉及用户态和内核态切换)。
追问方向包括:偏向锁为什么在JDK 15中默认被废弃(因为现代应用线程竞争普遍,偏向锁的撤销成本甚至高于收益,JEP 374将其默认禁用);轻量级锁自旋带来的CPU占用问题;以及synchronized与Lock的区别。Lock能提供可中断锁、公平锁、多个条件变量,但synchronized在JDK 8之后性能已经不输给Lock,日常开发首选synchronized。
2.2 线程池核心参数与执行流程
线程池是并发模块的必考题,也是我面试时喜欢“连环炮”的地方。
第一问:线程池的七大核心参数。核心线程数、最大线程数、空闲存活时间、时间单位、阻塞队列、线程工厂、拒绝策略。
第二问:执行流程。当提交一个任务时,线程池的处理顺序是:当前线程数小于核心线程数时,创建新线程执行任务;大于等于核心线程数时,任务放入阻塞队列;队列满了且线程数小于最大线程数时,创建新线程执行任务;如果线程数已达最大值,执行拒绝策略。这个流程,我建议画个流程图来记,面试时也主动画给面试官看,这是加分项。
第三问最拉开差距:核心线程数怎么设置。很多人只会背“CPU密集型设N+1,IO密集型设2N”的公式。要能进一步说明为什么:CPU密集型任务线程基本不阻塞,线程数多于CPU核心数只会增加上下文切换;IO密集型线程大量时间在等待IO,需要更多线程来充分利用CPU。更严谨一点,还可以提到Brian Goetz在《Java并发编程实战》中的估算公式:线程数 = CPU核心数 * (1 + 等待时间/计算时间)。
2.3 高并发场景题:volatile与原子类
场景题是这两年的新宠。比如:100个线程同时对count执行自增操作,怎么保证最终结果正确?
这个问题的坑在于,count++不是原子操作,它包含读取、加一、写回三步。可用方案包括:synchronized加锁、AtomicInteger原子类、LongAdder。追问:LongAdder和AtomicInteger的区别?要能答出LongAdder在JDK 8引入,采用分段累加的思想,在高并发下通过分散热点来提升性能,但sum()方法存在弱一致性问题,适合统计场景,不适合需要精确单一返回值的场景。
volatile的考点也不难:volatile的两大特性是可见性和有序性,但它不保证原子性。要能讲清楚volatile是如何通过内存屏障来实现可见性的,以及为什么它能防止指令重排序。
3. Spring/SpringBoot/SpringCloud全家桶:从注解到原理
3.1 Spring Bean生命周期与循环依赖
Spring是Java后端岗位的绝对重心,知识量极大。我面试时对Spring的考察分三层:
第一层:Bean的生命周期。面试官会问从BeanDefinition加载到Bean销毁经历了哪些关键步骤。核心要记住:实例化 -> 属性填充 -> Aware接口回调 -> BeanPostProcessor的postProcessBeforeInitialization -> InitializingBean或@PostConstruct的初始化方法 -> BeanPostProcessor的postProcessAfterInitialization(这里就是AOP代理创建的关键时机)-> 使用 -> 销毁。建议不要死记,而是理解Spring为什么这么设计——把扩展点暴露在关键节点,方便框架使用者介入。
第二层:循环依赖怎么解决。Spring解决循环依赖的核心是三级缓存。一级缓存存放完整的Bean;二级缓存存放早期的Bean(还没完成属性填充和初始化);三级缓存存放ObjectFactory,用于生成代理对象。要能解释清楚为什么需要三级缓存而不是两级——如果二级缓存直接存放早期对象,那么当这个Bean需要AOP增强时就无法替换成代理对象,三级缓存的ObjectFactory就是为了在合适的时机创建代理。同时要说清楚,Spring只能解决单例模式下、非构造器注入的循环依赖。
第三层:AOP底层原理。动态代理有两种方式:JDK动态代理(基于接口)和CGLIB(基于继承)。Spring Boot 2.x之后默认使用CGLIB。追问方向:JDK动态代理为什么要求目标类必须实现接口——因为它是通过反射生成目标接口的实现类,JVM动态代理类本来就继承了Proxy类,Java单继承决定了它只能基于接口。
3.2 SpringBoot自动配置原理
SpringBoot的自动配置是高频考点,也是我必问的一道题。回答框架很清晰:
启动类上的@SpringBootApplication是一个组合注解,包含@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan。自动配置的核心在@EnableAutoConfiguration,它通过@Import(AutoConfigurationImportSelector.class)导入配置项,这个Selector会读取META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件,加载所有自动配置类。
每个自动配置类上都有一组条件注解,比如@ConditionalOnClass(类路径存在指定类才生效)、@ConditionalOnMissingBean(容器中没有指定Bean才生效)、@ConditionalOnProperty(指定配置项才生效)。这就是为什么SpringBoot能自动帮我们配置DataSource、RedisTemplate,又允许我们通过自定义Bean覆盖默认配置。
要加分的话,主动提一下:自动配置的兜底机制——所有自动配置类的生效顺序由@AutoConfigureBefore、@AutoConfigureAfter控制,而自定义配置的优先级永远高于自动配置,这保证了框架的可扩展性。
3.3 SpringCloud微服务面试题
到2026年,SpringCloud已经是Java后端绕不开的技术栈。热点词中有“springcloud面试题”,说明热度一直没降。
面试中常见问题包括:服务注册与发现原理(服务启动时向注册中心注册自身实例信息,客户端从注册中心拉取服务列表或订阅变更,实现负载均衡和故障转移);OpenFeign的工作原理(通过动态代理生成HTTP客户端,将接口方法调用转换为HTTP请求,集成负载均衡和熔断);Gateway与Zuul的区别(Gateway基于WebFlux、异步非阻塞、性能更好);Sentinel和Hystrix的限流熔断机制的区别(Sentinel基于滑动窗口、支持实时监控和控制台,Hystrix基于线程池隔离或信号量隔离)。
微服务方面我还会问一个场景题:一个请求从客户端到后端,经过网关、多个微服务,如何做全链路追踪?要能答出TraceId和SpanId的概念、在网关生成TraceId并透传到下游、用MDC将TraceId注入日志、集成SkyWalking或Zipkin等方案。
4. 数据库与缓存:MySQL与Redis
4.1 MySQL索引与事务必问题
数据库是Java面试的第二大重点,热点词中“mysql面试题”也是常客。这里挑最核心的说。
索引高频题:InnoDB的B+树索引结构。要能画出B+树结构并说明它为什么适合磁盘存储——B+树的非叶子节点不存数据,一页能容纳更多索引项,树的高度更低,减少磁盘IO次数;叶子节点通过双向链表连接,方便范围查询。相比红黑树和哈希索引,B+树的优势也在这里。
最左前缀原则:联合索引(a,b,c)能走索引的场景包括a、a,b、a,b,c,为什么?因为B+树先按a排序,再按b排序,再按c排序,跳过了前面的列就无法利用有序性。追问场景:where a = 1 and c = 2能走索引吗?答案是只能用到a的索引,c是索引条件下推或回表处理。
事务高频题:事务四大特性ACID以及隔离级别。这里最常问的是MySQL默认隔离级别为什么是可重复读。要答出两点:一是MySQL的binlog在statement格式下,如果使用读已提交,可能出现主从数据不一致;二是可重复读配合间隙锁可以解决部分幻读问题。再追问:间隙锁和next-key lock是什么,InnoDB在可重复读级别下,对范围查询会加next-key lock,锁定记录及之前的间隙,防止其他事务插入记录导致幻读。
存储引擎的区别也常考:InnoDB和MyISAM有什么区别。要答出事务支持、行级锁和表级锁、聚簇索引和非聚簇索引、外键支持、崩溃恢复能力这五个维度。
4.2 Redis面试题:缓存三兄弟与持久化
Redis在Java面试中的地位比MySQL还高。热点词里“redis面试题”排在前列。最核心的考点是缓存穿透、缓存击穿、缓存雪崩,简称缓存三兄弟。
- 缓存穿透:查询一个绝对不存在的数据,缓存和数据库都没有,请求直接打到数据库。解决方法是布隆过滤器拦截,或者缓存空值并设置短过期时间。
- 缓存击穿:某个热点key过期瞬间,大量并发请求直接打到数据库。解决方法是互斥锁(只允许一个线程去查数据库并重建缓存)或逻辑过期。
- 缓存雪崩:大量key同时过期,或者Redis宕机,导致数据库压力陡增。解决方法是过期时间加随机值、多级缓存、Redis高可用。
深挖题是缓存与数据库的一致性:先更新数据库还是先删除缓存?业界常用方案是先更新数据库,再删除缓存,因为删除缓存失败的概率低于更新缓存的成本,而且删除缓存不涉及并发写缓存的问题。要能提到binlog订阅删除缓存的方案,通过Canal监听MySQL的binlog变更,异步删除对应缓存,保证最终一致性。
Redis持久化也要能讲:RDB和AOF的区别。RDB是定时快照,恢复速度快但可能丢数据;AOF是追加写日志,根据fsync策略控制数据丢失量,但文件大、恢复慢。还想加分的话,提一下Redis 7引入的多部分AOF(Multi Part AOF)机制,它解决了AOF文件重写时可能阻塞主线程的问题。
4.3 数据库状态码21012:Linux与MySQL联动考点
这里提一下热点词里的“linux面试题”和“linux面试题测试”。Java开发岗位面试,Linux基础不再是运维专属。2026年的面试里,面试官常把Linux命令和Java问题结合起来考。
比如:线上应用CPU飙升到100%,你怎么排查?标准操作:top命令找到CPU占用最高的进程,top -Hp <pid>找到占用最高的线程,printf "%x\n" <线程ID>转成十六进制,jstack <pid> > dump.log导出线程快照,在dump文件中搜索十六进制线程ID,定位到出问题的代码行。再追问:如果dump文件里看到大量线程卡在Object.wait(),说明什么?大概率是线程池队列满了,任务在排队等待。
再比如:服务内存OOM,怎么用Linux命令做初步判断。free -h看总内存和已用内存,jmap -heap <pid>看堆内存分布,jstat -gcutil <pid> 1000看GC频率和耗时。这些排查命令是2026年面试中越来越常见的实操题。
5. 消息队列与分布式场景题
5.1 Kafka高频面试题精讲
热点词中“kafka面试题”和“kafka面试题及答案”都在榜,说明Kafka是Java面试的重要方向。这里按我的提问习惯来拆:
第一题:Kafka为什么快。这是Kafka最常问的题。要答出三点:顺序写磁盘(Kafka利用磁盘顺序IO的优势,追加写入,不随机寻道);页缓存(操作系统的Page Cache,读写走内存,不经过JVM);零拷贝(利用sendfile系统调用,数据从磁盘直接到网卡,减少内核态和用户态的两次拷贝)。零拷贝要能说出Kafka在消费者拉取消息时使用了FileChannel.transferTo或sendfile。
第二题:Kafka的副本机制和ISR。Kafka通过分区多副本保证高可用,每个分区有一个Leader和多个Follower。ISR是同步副本集合,只有ISR中的副本才有资格被选为Leader。要能答出min.insync.replicas参数的作用,以及producer端设置acks=all时,只有ISR中的所有副本都写入成功才返回成功。
第三题:Kafka如何保证消息不丢失和不重复消费。不丢失需要从三个端说明:生产者端使用acks=all并开启重试;broker端设置replication.factor >= 3、min.insync.replicas >= 2;消费端关闭自动提交、消费完成后手动提交offset。不重复则需要消费端做幂等处理,常用的幂等方案有数据库唯一键、Redis setnx、状态机。
5.2 分布式场景设计题:怎么回答才不虚
2026年面试中,场景设计题的比例明显提升,尤其是高级岗。常见题目包括:设计一个限流组件、设计一个分布式锁、设计一个秒杀系统。
以分布式锁为例,标准答案流程是:用Redis的SET key value NX EX 30获取锁,业务处理完成后用Lua脚本校验value并删除,防止误删他人的锁。追问方向包括:锁过期了但业务还没执行完怎么办——用Redisson的看门狗机制自动续期;Redis主从切换时锁丢失怎么办——用RedLock算法(向多个独立Redis节点加锁),但RedLock本身也有争议,实际工业界用得少。
这类题的回答技巧是:不要一上来就讲技术细节,先明确需求边界。比如“分布式锁”要说明锁的粒度、持有时间、可重入要求、是否需要公平性,然后再给出方案。面试官最反感的就是背答案型的回答——题目稍微变一下就不适配了。
6. 算法与代码能力:面试手撕环节
6.1 高频排序算法:冒泡排序与快速排序
热点词里“冒泡排序java”和“快速排序java实现”都在,说明手写算法依然是Java面试的必考环节。这篇讲一下面试时我让对方手撕排序算法的评分标准。
冒泡排序是最基础的排序,代码简单,5分钟内要写出来。要注意能顺手说出时间复杂度O(n²)、空间复杂度O(1),以及优化方式——设置一个swapped标志位,如果某一轮没有发生交换,说明已经有序,直接结束排序。
java复制public static void bubbleSort(int[] arr) {
if (arr == null || arr.length < 2) {
return;
}
for (int i = arr.length - 1; i > 0; i--) {
boolean swapped = false;
for (int j = 0; j < i; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
swapped = true;
}
}
if (!swapped) {
break;
}
}
}
快速排序才是重头戏。要写出经典的Lomuto分区或Hoare分区版本,说清楚每次partition选择一个基准值,将数组分成左边小于基准、右边大于基准的两部分,再递归排序左右子数组。平均时间复杂度O(nlogn),最坏情况O(n²)(数组本身有序时),可以通过随机选择基准值来规避最坏情况。
java复制public static void quickSort(int[] arr, int left, int right) {
if (left >= right) {
return;
}
int pivot = partition(arr, left, right);
quickSort(arr, left, pivot - 1);
quickSort(arr, pivot + 1, right);
}
private static int partition(int[] arr, int left, int right) {
int pivot = arr[right];
int i = left;
for (int j = left; j < right; j++) {
if (arr[j] < pivot) {
swap(arr, i, j);
i++;
}
}
swap(arr, i, right);
return i;
}
private static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
注意:面试手撕算法时,不要写一个能跑就交差,建议加上关键注释,提前分析边界条件(数组为空、长度为1、全相等元素)。这些细节在面试官眼里是“工程素养”的体现。
6.2 手写题练习建议与常见考题
除了排序,这几道手写题在2026年的面试中同样高频:
- 单例模式:要求写出双重检查锁定的版本,加volatile防止指令重排,讲清楚为什么需要volatile、为什么两次判断。
- 数组相关的算法:热点词里“java中数组越界异常”也常是面试起点。面试官会让写一个数组题目,然后追问数组越界的底层表现:Java数组索引越界会抛出
ArrayIndexOutOfBoundsException,其他语言(如C语言)则是未定义行为,这是Java安全性的体现。 - 二叉树遍历:前中后序遍历的递归写法是基础,能写非递归版本(用栈模拟)是加分项。
- LRU缓存:实现一个LRU缓存,要求get和put都是O(1)。标准方案是HashMap + 双向链表,注意链表的节点删除和插入顺序。
练习建议:每天写2-3道算法题,重点不是做对,而是能讲清楚思路。面试时面对题目,先说暴力解(确保能跑),再优化(体现思考过程),不要一上来就闷头写,思路交流也是评分点。
7. 技术栈联动细节与面试避坑指南
7.1 开发环境类问题:源发行版、Lombok报错一网打尽
热点词里有些看上去不太像面试题的内容,比如“java: 警告: 源发行版 17 需要目标发行版 17”“java: you aren't using a compiler supported by lombok, so lombok will not wo”“java安装”等。这些其实是面试前的“环境坑”,但也经常会变成面试的突破口。
“源发行版17需要目标发行版17”这个警告,本质是编译器版本和项目字节码版本不一致。maven编译时默认使用的JDK版本和IDE中设置的Java版本不同步就会报这个。解决方式是在pom.xml中显式设置maven.compiler.source和maven.compiler.target,或者使用spring-boot-starter-parent统一管理。这类问题面试官可能会延伸问:JDK 17和JDK 8有什么区别?至少要说得出JDK 17属于LTS版本,引入了密封类、switch模式匹配、增强的伪随机数生成器,以及移除了偏向锁等变更。
Lombok报错“you aren't using a compiler supported by lombok”也属于工具链问题,通常是Lombok版本和JDK版本不兼容。比如JDK 16及以上需要用Lombok 1.18.20以上版本。面试中如果被问到Lombok的原理,要能回答:Lombok通过注解处理器(Annotation Processor)在编译期修改抽象语法树(AST),生成getter、setter、builder等方法。追问“Lombok的@Slf4j生成的logger字段在什么时候存在”——答案是编译期生成,源码里看不到,但编译后的class文件里有。还有个小众坑:Lombok和MapStruct一起用时,如果两个注解处理器顺序不对可能互相干扰,解决方式是显式声明annotationProcessorPaths。
7.2 面试中容易翻车的十个细节
这些是我做面试官时观察到的、候选人在基础题上翻车率最高的点:
- fail-fast和fail-safe机制分不清。ArrayList的迭代器是fail-fast,修改结构会抛
ConcurrentModificationException;CopyOnWriteArrayList是fail-safe,迭代时基于快照,不会抛异常。很多人只说得出名字,但解释不清底层是通过modCount校验实现的。 - ==和equals的区别。这个人人都会背,但问“Integer缓存范围是多少”就很多人卡住。Integer默认缓存-128到127,超过这个范围用
==比较是不相等的。面试官追问“为什么缓存范围是-128到127”,因为高频使用小整数,缓存命中率高,且范围与byte类型一致,实现简单。 - 重载和重写的区别,以及static方法能不能重写。static方法是编译期绑定,不存在重写的概念,子类定义相同签名的static方法只是隐藏了父类方法。
- 接口和抽象类的区别。要能补充JDK 8之后接口可以有default和static方法,JDK 9之后接口可以有private方法。还要提到抽象类偏向“是什么”,接口偏向“能做什么”。
- Error和Exception的区别。要能说到Error是JVM层面的严重问题,比如OutOfMemoryError、StackOverflowError,程序无法恢复;Exception是程序层面的问题,分为受检异常和非受检异常。很多人在“RuntimeException需要捕获吗”这个问题上犹豫,其实受检异常强制处理,非受检异常不需要显式捕获。
- Java是值传递还是引用传递。这个争论了很多年的问题,标准答案是Java只有值传递。对象引用作为参数传入方法时,传递的是引用的拷贝,修改引用指向的对象内容会影响原对象,但重新给形参赋值不会影响实参。要能举出具体例子。
- 数组和ArrayList的转换。
Arrays.asList()返回的是固定大小的列表,不能调用add/remove方法,否则抛UnsupportedOperationException。这个问题很基础,但实际编码中踩坑的人特别多。 - 事务失效的场景。Spring事务自调用会失效、私有方法加@Transactional会失效、异常被捕获后不抛出会失效、抛出受检异常默认不回滚。面试中常让候选人说出三种以上场景,很多人只能说出一种。
- MySQL的varchar长度和字符集的关系。varchar(255)在utf8mb4下最多能存255个字符而不是255个字节,字段定义长度和存储空间的计算很多人搞混。
- Redis的key过期策略。Redis采用惰性删除加定期删除的组合策略,很多人只记得“定期删除”,忘了惰性删除的部分。
7.3 2026年Java面试趋势:问法变了,考察点变了
最后从面试官视角聊一下2026年Java面试的变化趋势。
第一,项目拷问深度加大。现在面试官很少问“你项目中用了Redis吗”,而是会问“你这个业务场景为什么用Redis不用本地缓存”“你项目中Redis的key是怎么设计和管理的”“缓存穿透了怎么办”。如果你的项目经验是包装出来的,这几轮追问必然露馅。所以准备面试的核心,是把你写在简历上的项目真正吃透,包括当时为什么做这个技术选型、有没有对比过替代方案、上线后有没有踩坑、如何监控和排查问题。
第二,AIGC工具使用成为考察点。2026年面试AI辅助编程工具已经成为新常态。面试官会问:你在日常开发中如何使用AI工具?AI生成的代码你会怎么审查?AI给出一种实现方案,你怎么判断它是否适合当前业务场景?这个趋势的本质是考察候选人的代码评审能力、工程判断力和自主学习能力。我个人的建议是诚实回答自己实际的使用习惯,不要编造,面试官更看重你对AI产出代码的批判性思维。
第三,基础仍然重于一切。虽然新技术层出不穷,但面试的压轴题依然是HashMap、线程池、Spring生命周期、MySQL索引、Redis缓存。这些基础内容不是背一遍就完,而是要理解设计背后的权衡、理解它们在真实项目中的应用边界。我在实际面试中发现一个规律:基础扎实的人,聊起新技术的接受度也普遍更高,因为底层原理是相通的。
第四,全栈联动题增多。前端面试题、vue3面试题、react面试题、分布式、Linux等都在热点词中出现,这反映了面试岗位JD的复合化趋势。现在的Java岗位面试,虽然以Java为主,但会穿插考察你能否读懂前端代码、能否排查服务器问题、能否和算法或测试同事协作。热点词里“软件测试面试题”“嵌入式面试题”“flutter面试题”的出现也说明很多非纯Java岗位也在用Java作为基础语言进行面试。
提示:准备2026年面试,不要再只盯着“xx面试题大全”的资料死记硬背。我自己带过的几个实习生里,刷了三四百道题但项目一问三不知的,最后都没过终面;相反,有几个虽然题目刷得不多,但对自己做过的功能、用到的技术原理理解很深,反而顺利拿到了offer。面试是认知和表达的综合测试,不是题库的复读机。
结合我这些年的面试经验,最后分享一个实用建议:准备面试时,把每个高频考点整理成一页纸的“面试回答框架”。先是一句话概括(30秒内讲完核心),然后是3-5个关键点展开(2-3分钟讲完细节),最后是一个项目结合案例(证明你真的在实战中用过)。这样即使面试官不断追问,你也能从自己准备好的知识网格中按图索骥,而不是临场拼凑记忆碎片。这个准备方法,从初级到高级岗都适用,也是我见过的最有效的面试准备方式。
