面试常见的jdk---LTS版本新特性梳理

张开发
2026/4/11 4:30:17 15 分钟阅读

分享文章

面试常见的jdk---LTS版本新特性梳理
Java LTS版本 面试高频知识点真题梳理适配Java 8/11/17/21四大核心长期支持版本覆盖初中高级开发面试100%高频考点每个知识点配套真题标准答题思路可直接用于面试背诵与简历梳理。前言Java面试中LTS版本相关问题的核心考察逻辑从来不是让你背诵版本号和新特性列表而是考察你对Java底层原理的理解深度你在生产环境中版本升级的实战经验你对技术选型的判断能力收益vs风险你对Java并发、JVM、语言设计的整体认知本文按照「核心知识点 → 高频面试题 → 标准答题思路」的结构梳理贴合面试场景。一、Java 82014划时代LTS面试打底必考Java 8是Java发展史上最具革命性的版本也是目前存量系统最多的版本所有Java面试无论级别都会覆盖Java 8的核心考点是面试的基础盘。核心常考知识点1. 核心语言特性Lambda表达式函数式编程的核心简化匿名内部类的写法支持将函数作为方法参数传递函数式接口只有一个抽象方法的接口FunctionalInterface标记是Lambda的载体常见内置接口Consumer/Supplier/Function/PredicateStream流针对集合的声明式处理API支持串行/并行操作简化集合的过滤、映射、聚合等操作Optional类用于解决空指针异常NPE问题提供了优雅的非空校验与值处理方式接口默认方法/静态方法接口中可以定义带实现的方法解决接口升级时的实现类兼容问题2. 全新时间日期API新增java.time包替代线程不安全的java.util.Date/Calendar核心类LocalDate/LocalDateTime/ZonedDateTime/DateTimeFormatter所有类均为不可变类线程安全3. JVM底层重大变化元空间Metaspace替代永久代PermGen永久代被彻底移除类元数据移到本地内存Native Memory不再受JVM堆内存限制大幅减少永久代OOM问题4. 异步编程增强CompletableFuture实现了Future和CompletionStage接口支持链式调用、组合式异步编程解决了传统Future的阻塞、无法组合的痛点对应高频面试题答题思路面试题1Lambda表达式的底层实现原理是什么和匿名内部类有什么本质区别答题思路底层原理Lambda表达式在编译时会被JDK的invokedynamic指令动态生成匿名内部类而非编译期生成固定的class文件相比匿名内部类更轻量化核心区别作用域不同匿名内部类会创建新的作用域Lambda不会直接使用当前方法的作用域this指向不同匿名内部类的this指向自身实例Lambda的this指向所在的外部类实例字节码生成时机不同匿名内部类编译期生成class文件Lambda运行期通过invokedynamic动态生成内存占用Lambda不会生成额外的class文件内存占用更低面试题2Stream流和for循环有什么区别什么场景下用Stream更合适答题思路核心区别编程范式for循环是命令式编程需要手动写遍历、判断、处理的全流程Stream是声明式编程只需要指定“做什么”不需要关心“怎么做”执行方式for循环是立即执行Stream是惰性执行只有调用终止操作collect/count等时才会执行中间操作并行支持Stream天然支持并行流parallelStream()无需手动编写多线程代码for循环需要手动实现并行逻辑适用场景集合的复杂处理过滤、映射、聚合、分组、去重等Stream代码更简洁、可读性更高需要并行处理大集合的场景并行流可以充分利用多核CPU不适用场景简单的遍历、需要修改外部变量、对性能极致敏感的小数据量操作面试题3为什么Java 8要用Metaspace替代永久代Metaspace和永久代的核心区别是什么答题思路替代的核心原因永久代有固定的JVM内存上限很容易出现java.lang.OutOfMemoryError: PermGen space异常尤其是在大量动态生成类的场景Spring、MyBatis等框架永久代的GC和老年代绑定回收效率低类元数据的回收需要Full GC合并HotSpot和JRockit虚拟机的设计JRockit没有永久代的概念核心区别内存位置永久代使用JVM堆内存Metaspace使用本地内存Native Memory默认只受系统可用内存限制OOM概率Metaspace没有固定上限大幅降低了元数据OOM的概率GC策略Metaspace有独立的GC机制当类元数据达到阈值时会触发GC回收效率更高面试题4Optional类能彻底解决空指针异常吗正确的使用姿势是什么答题思路不能彻底解决Optional只是一个用于优雅处理空值的容器不能解决所有NPE场景错误使用反而会增加代码复杂度正确使用姿势不要用Optional声明成员变量、方法参数只用于方法的返回值明确告知调用方返回值可能为空不要用optional.get()直接取值必须配合isPresent()判断或使用orElse()/orElseGet()/orElseThrow()处理空值不要用Optional包装null不要用Optional.of(null)应该用Optional.ofNullable()链式处理通过map()/flatMap()/filter()进行链式的空值处理替代多层if-else非空判断二、Java 112018企业升级首选跳板生产环境主流Java 11是Java 8之后的第二个LTS版本也是目前企业生产环境占比最高的版本是从Java 8升级的首选跳板面试核心考察升级兼容、模块化、生产落地相关内容。核心常考知识点1. 模块化系统JPMS核心是module-info.java模块描述文件实现了代码的强封装、依赖的显式声明解决了Java之前的“Jar地狱”问题控制包的访问权限只有模块导出的包才能被外部访问实现了JDK的模块化拆分用户可以按需打包JRE减小部署包体积2. 局部变量类型推断var关键字编译器可以根据右侧的赋值表达式自动推断变量的类型简化代码编写仅适用于局部变量不能用于成员变量、方法参数、返回值类型3. 内置HTTP Client API新增java.net.http包提供了原生的、支持同步/异步、HTTP/2的HTTP客户端替代了老旧的HttpURLConnection功能、性能、易用性远超传统API4. 核心API增强String类新增实用方法isBlank()/strip()/repeat()/lines()集合增强List.of()/Set.of()/Map.of()创建不可变集合的便捷方法Optional增强ifPresentOrElse()/or()方法5. JVM/工具/GC重大变化Flight Recorder飞行记录器开源之前是商业特性Java 11开源免费是JVM性能排查的神器G1成为默认垃圾收集器替代了Java 8的Parallel GC兼顾吞吐量和低延迟ZGC/Shenandoah GC实验性引入里程碑式的低延迟GC停顿时间控制在亚毫秒级彻底移除了Java EE相关模块JAXB、JAX-WS、JTA等升级时需要手动引入依赖对应高频面试题答题思路面试题1Java 11的模块化系统JPMS解决了什么问题升级时遇到过什么模块化相关的坑答题思路解决的核心问题强封装之前Java的包访问权限控制很弱只要类是public整个JVM都能访问模块化可以控制只有导出的包才能被外部访问提升了安全性和可维护性解决Jar地狱显式声明模块依赖避免了依赖冲突、版本混乱的问题可裁剪性JDK自身模块化拆分可以通过jlink工具按需裁剪JRE减小部署包体积适合微服务、容器化场景可靠配置编译期就能检查模块依赖是否完整避免运行时出现类找不到的异常升级常见坑解决方案反射访问失败模块化强封装下反射访问JDK内部类会抛出InaccessibleObjectException解决方案是通过--add-opens参数开放对应模块的访问权限依赖缺失Java 11移除了Java EE相关模块项目中用到JAXB、JAX-WS等组件时需要手动在pom.xml中引入对应的第三方依赖类路径冲突模块化和传统的ClassPath混用会出现类加载异常解决方案是尽量统一使用模块化或调整依赖的加载顺序面试题2var关键字的使用限制有哪些会影响Java的静态类型特性吗答题思路核心使用限制仅能用于局部变量不能用于类的成员变量、方法参数、方法返回值类型声明时必须立即赋值编译器需要根据赋值表达式推断类型不能声明为null不能用于多变量复合声明比如var a1, b2;是非法的不能用于Lambda表达式的参数类型Java 11支持var用于Lambda参数但必须全用var声明不会影响Java的静态类型特性var只是编译期的语法糖编译器会自动推断出变量的具体类型编译后的字节码和显式声明类型完全一致类型在编译期就已经确定运行期不能改变不会变成动态类型语言完全不影响Java的静态类型安全面试题3Java 11为什么要把G1设为默认GC和Java 8默认的Parallel GC有什么区别答题思路设为默认的核心原因随着硬件发展服务器多核CPU成为主流业务对低延迟的需求越来越高Parallel GC主打高吞吐量但Full GC的停顿时间很长无法满足低延迟需求G1是区域化、分代式的GC兼顾吞吐量和低延迟可预测停顿时间适合绝大多数业务场景G1的内存管理更高效对大内存的支持更好适合现代服务器的大堆场景核心区别特性Parallel GCG1 GC设计目标极致的吞吐量可预测的低延迟兼顾吞吐量内存布局传统的连续分代年轻代老年代把堆分成多个大小相等的Region逻辑上分代垃圾回收方式全堆的Full GC停顿时间不可控增量式回收优先回收垃圾多的Region停顿时间可设置适用场景后台批处理、对吞吐量要求极高的场景业务系统、Web服务、对延迟敏感的场景三、Java 172021当前大厂主流LTS面试重点Java 17是目前国内互联网大厂的主流生产版本也是Oracle提供免费长期支持的版本面试核心考察新特性的生产落地、和Java 8的差异、升级收益。核心常考知识点1. 核心语言特性Records记录类用于创建不可变的数据载体类自动生成equals()/hashCode()/toString()/全参构造器/getter方法无需手动编写模板代码Sealed Classes密封类通过sealed关键字和permits子句控制类的继承权限只有指定的类才能继承该密封类实现了更精细的继承控制Text Blocks文本块通过包裹多行字符串无需手动拼接换行符、转义引号大幅简化JSON、SQL、XML等多行字符串的编写switch模式匹配支持在switch中进行类型判断、模式匹配简化多类型分支的代码编写从预览版转为正式版2. 安全性与强封装强封装默认开启彻底移除了--illegal-access参数默认禁止所有对JDK内部未导出模块的非法反射访问提升了JDK的安全性废弃了安全管理器Security Manager标记为待移除3. JVM/GC重大升级ZGC/Shenandoah GC正式生产可用低延迟GC完全成熟停顿时间稳定在亚毫秒级支持TB级大堆G1 GC的持续优化内存回收效率、停顿控制大幅提升增强的伪随机数生成器新增RandomGenerator接口提供了更安全、性能更好的随机数实现4. 并发与API增强虚拟线程Virtual Threads引入预览版为Java 21的正式版打下基础Stream、Optional、集合API的持续增强新增更多便捷方法四、关键差异对比维度Java 8 (2014)Java 11 (2018)Java 17 (2021)Java 21 (2023)面试高频点LTS 周期2014-2030商业支持2018-2026免费支持到 20262021-20292023-2030为什么选 LTS模块化无JPMS模块系统实验JPMS 正式 强封装JPMS 更完善–illegal-access 已移除语言特性Lambda、Stream、Optional、Default 方法var、String 增强isBlank/strip/repeat、HTTP ClientRecords、Sealed Classes、Pattern Matching for switch预览、Text BlocksRecord Patterns、Pattern Matching for switch正式、Virtual Threads、Structured Concurrency、Scoped Values虚拟线程原理JVM / 内存模型Metaspace永久代移除更强 GCZGC 实验、Flight Recorder 开源虚拟线程预览、类加载严格、增强伪随机数虚拟线程正式、Generational ZGC、Vector API 孵化Metaspace OOM、虚拟线程 vs 传统线程GC 变化Parallel CMS 默认G1 默认、ZGC/Shenandoah 实验G1 优化、ZGC 生产可用Generational ZGC分代ZGCG1 vs ZGC vs 虚拟线程API / 移除-移除 Java EEJAXB、JAX-WS 等需自行引入移除 Applet、安全管理器过时移除 Finalization、String Templates预览升级时最容易踩的坑并发模型传统线程OS 线程传统线程虚拟线程预览虚拟线程Project Loom正式面试最爱问性能/安全性基础更强加密、Flight Recorder强封装–illegal-accessdenyScoped Values、Vector API安全性提升企业采用率2026仍有 30% 遗留系统最高40%快速上升主流快速增长推荐简历写哪个版本对应高频面试题答题思路面试题1Java 17的Records类和Lombok的Data注解有什么本质区别适用场景是什么答题思路本质区别定位不同Records是Java语言层面的特性专门用于不可变数据载体核心设计目标是透明的持有数据Lombok的Data是第三方注解处理器是通用的Java类模板代码生成工具支持可变类不可变性Records生成的类是final的所有成员变量也是final的天生不可变没有setter方法Data默认生成setter方法类是可变的除非手动添加Value注解继承限制Records类默认继承java.lang.Record不能再继承其他类Data生成的类可以自由继承其他类可靠性Records是JDK原生支持编译期、运行期都有保障不会出现编译问题Lombok依赖注解处理器不同IDE、JDK版本可能出现兼容问题适用场景Records适用场景数据传输对象DTO、返回值封装、函数式编程中的数据载体、领域模型中的值对象所有需要不可变数据容器的场景Data适用场景需要可变的实体类、复杂的业务类、需要灵活定制get/set逻辑的场景面试题2密封类Sealed Classes解决了什么问题和final类、访问权限控制有什么区别答题思路解决的核心问题之前Java的继承控制只有两种极端要么用final禁止所有继承要么用public允许所有类继承没有中间态的精细控制密封类可以精确控制哪些类可以继承自己实现了对类层次结构的完全掌控非常适合领域驱动设计DDD、状态机、枚举替代等场景为模式匹配提供了基础编译器可以知道密封类的所有子类在switch模式匹配时可以穷尽所有分支无需写default分支和final、访问权限的区别和final类的区别final类完全禁止继承密封类允许指定的子类继承子类可以是final、sealed或non-sealed和访问权限控制的区别private/protected/public只能控制类的可见性不能控制可见类的继承行为密封类在类可见的前提下依然可以控制继承权限面试题3Java 17彻底移除了–illegal-access参数对项目升级有什么影响怎么解决答题思路核心影响Java 9~16中--illegal-access参数默认是permit允许非法反射访问JDK内部类只会给出警告Java 17彻底移除了这个参数默认禁止所有非法反射访问直接抛出InaccessibleObjectException很多老旧框架低版本的Spring、MyBatis、Hibernate、Jackson等会通过反射访问JDK内部的sun.misc.Unsafe、java.lang等包的内部类升级到Java 17后会直接报错解决方案优先升级框架版本把Spring Boot、Spring Cloud、MyBatis等核心框架升级到支持Java 17的版本这是最根本的解决方案临时解决方案通过JVM启动参数--add-opens开放对应模块的访问权限比如--add-opens java.base/java.langALL-UNNAMED开放java.lang包的反射访问权限代码改造替换项目中直接访问JDK内部API的代码改用官方公开的API四、Java 212023未来趋势中高级面试必问Java 21是最新的LTS版本带来了Java史上最具革命性的并发编程特性目前国内大厂正在快速落地中高级Java开发面试中Java 21的考察占比越来越高核心考点就是虚拟线程。核心常考知识点1. 里程碑特性虚拟线程Virtual ThreadsProject Loom正式版轻量级用户态线程由JVM调度不绑定操作系统内核线程创建成本极低可轻松支持十万甚至百万级并发完全兼容传统的Thread API代码无需大幅改造就能获得极高的并发能力解决了传统Java线程模型的痛点内核线程成本高、并发量受限、I/O阻塞时线程被浪费2. 并发编程革新结构化并发Structured Concurrency通过StructuredTaskScope把多个异步任务绑定到同一个作用域实现了“成功一起成功失败一起失败”的结构化并发简化了异步代码的编写、错误处理和取消Scoped Values不可变的、线程安全的、作用域绑定的局部变量替代了传统的ThreadLocal解决了ThreadLocal的内存泄漏、父子线程传递复杂、不可变等问题3. 语言特性完善Record模式支持对Records类进行模式匹配解构Record中的数据简化复杂数据的处理switch模式匹配正式版完全支持类型模式、守卫模式、Record模式实现了全功能的模式匹配4. JVM/GC重大升级分代ZGCGenerational ZGC正式引入在ZGC低延迟的基础上加入了分代回收大幅提升了吞吐量降低了内存占用同时保持了亚毫秒级的停顿时间Vector API孵化支持向量计算充分利用CPU的SIMD指令大幅提升数值计算、AI推理等场景的性能对应高频面试题答题思路面试题1虚拟线程和传统的平台线程有什么本质区别底层实现原理是什么答题思路本质区别特性平台线程传统线程虚拟线程调度主体操作系统内核调度JVM在用户态调度绑定关系一个Java线程对应一个内核线程1:1模型多个虚拟线程挂载在同一个平台线程上M:N模型创建成本极高栈内存默认1MB创建上千个就会OOM极低栈内存动态伸缩创建百万级也不会OOM上下文切换内核态切换成本极高耗时微秒级用户态切换成本极低耗时纳秒级阻塞行为I/O阻塞时内核线程被挂起资源浪费I/O阻塞时虚拟线程会被JVM卸载平台线程继续执行其他虚拟线程资源利用率极高底层实现原理虚拟线程的载体是平台线程ForkJoinPoolJVM会把多个虚拟线程挂载到少量的平台线程上执行当虚拟线程遇到I/O阻塞、sleep、LockSupport.park()等阻塞操作时JVM会把这个虚拟线程从平台线程上卸载下来保存栈上下文然后挂载另一个就绪的虚拟线程到平台线程上执行当阻塞操作完成后虚拟线程会重新进入就绪队列等待被挂载到平台线程上继续执行整个过程完全由JVM在用户态完成不需要内核参与避免了内核线程的上下文切换极大提升了并发能力面试题2虚拟线程的适用场景和不适用场景是什么使用时要注意什么坑答题思路适用场景I/O密集型任务Web服务、微服务接口、数据库访问、远程调用、文件读写等这是虚拟线程最核心的适用场景能极大提升系统的并发量大量阻塞等待的任务比如定时任务、消息消费、网关代理等传统的线程池代码几乎无需改造就能直接使用虚拟线程获得性能提升不适用场景CPU密集型任务数值计算、加密解密、视频编码等这类任务本身就会占满CPU虚拟线程不会带来任何收益反而会增加调度开销执行时间极短的任务虚拟线程的调度有轻微开销执行时间极短的任务开销会超过收益使用时的核心坑注意事项不要用传统的固定线程池管理虚拟线程虚拟线程是无限的应该用Executors.newVirtualThreadPerTaskExecutor()每个任务创建一个虚拟线程避免在虚拟线程中使用长时间的CPU密集操作会占用平台线程导致其他虚拟线程无法调度谨慎使用ThreadLocal虚拟线程数量极大ThreadLocal会占用大量内存推荐使用Scoped Values替代避免使用synchronized同步块长时间阻塞会导致虚拟线程无法卸载平台线程被阻塞推荐使用java.util.concurrent.locks包的锁替代面试题3Scoped Values和传统的ThreadLocal有什么区别解决了什么痛点答题思路解决的核心痛点ThreadLocal是可变的任何代码都能修改它的值线程安全无法保障ThreadLocal很容易出现内存泄漏尤其是在线程池中线程生命周期很长ThreadLocal的值不会被回收父子线程之间的传递非常复杂需要用InheritableThreadLocal而且线程池中传递会失效虚拟线程场景下ThreadLocal会占用大量内存因为虚拟线程数量极大每个线程都有自己的ThreadLocalMap核心区别特性ThreadLocalScoped Values可变性可变任何地方都能set修改值不可变绑定作用域一旦创建就不能修改生命周期绑定线程线程不销毁值就一直存在绑定作用域作用域结束值就自动回收不会内存泄漏父子传递复杂需要InheritableThreadLocal线程池传递失效天生支持父子线程传递结构化并发中自动传递内存占用每个线程都有一个ThreadLocalMap内存占用高全局共享作用域绑定内存占用极低适合虚拟线程线程安全可变线程安全无法保障不可变天生线程安全五、跨版本综合高频面试题面试必问压轴题这部分是面试官最爱问的压轴题考察你对Java版本体系的整体认知以及生产实战经验。面试题1什么是LTS版本为什么企业生产环境只选LTS版本不选非LTS版本答题思路LTS的定义LTS是Long-Term Support的缩写即长期支持版本Oracle会为LTS版本提供长达8年以上的免费更新、安全补丁、bug修复而非LTS版本只有6个月的支持周期下一个版本发布后就停止更新企业只选LTS的核心原因稳定性与安全性企业生产系统需要长期稳定运行LTS版本有长期的安全补丁和bug修复而非LTS版本很快就停止维护出现安全漏洞、bug无法得到官方修复生态适配主流的开源框架Spring、MyBatis、Dubbo等只会针对LTS版本做长期适配和兼容测试非LTS版本很容易出现框架兼容问题升级成本非LTS版本每6个月发布一个版本迭代太快企业根本没有精力每6个月升级一次版本LTS版本的发布周期是2~3年升级成本可控风险可控LTS版本经过了长期的市场验证bug、兼容性问题都被充分暴露和修复而非LTS版本是尝鲜版很多特性是实验性的生产环境使用风险极高面试题2为什么“新版任你发我用Java 8”Java 8发布10多年了至今仍被大量企业使用的核心原因是什么答题思路革命性的特性完全够用Java 8带来了Lambda、Stream、Optional、CompletableFuture、新时间API等划时代的特性补齐了Java现代编程的能力绝大多数业务场景Java 8的特性完全够用升级成本极高存量系统越大升级成本越高尤其是运行了多年的老系统代码量大、依赖复杂、很多老旧框架不再维护升级会出现大量兼容问题升级需要全面的回归测试需要投入大量的人力、时间对于已经稳定运行的系统没有足够的收益驱动升级生态绑定大量的老旧框架、中间件、业务组件都是基于Java 8开发的很多已经停止维护无法适配高版本Java升级需要替换大量组件甚至重构代码人才与技术栈惯性绝大多数Java开发的技术栈都是基于Java 8的招聘、培训、代码规范都是围绕Java 8升级高版本需要团队整体学习新特性改变编码习惯稳定大于一切企业生产系统的核心诉求是稳定只要系统能正常运行没有安全漏洞、性能问题就不会轻易升级避免升级带来的不可控风险面试题3推荐的Java版本升级路线是什么为什么不推荐直接从Java 8升级到21答题思路推荐的升级路线Java 8遗留系统 ↓先升11升级成本最低兼容性最好 Java 11稳定LTS生产首选跳板 ↓大厂主流生态成熟 Java 17特性完整强封装成熟 ↓未来趋势性能飞跃 Java 21虚拟线程正式版并发革命不推荐直接从Java 8升级到21的核心原因兼容性跨度太大Java 8到Java 21间隔了13个版本中间有大量的API被移除、语法被改变、JVM行为被调整直接升级会出现大量的兼容问题排查难度极大框架适配问题很多老旧框架支持Java 11但不支持Java 17/21直接升级到21需要一次性升级所有框架风险极高升级风险不可控一次性跨多个大版本升级出现问题很难定位是哪个版本的变化导致的分步升级可以把风险拆分每个版本只解决对应版本的兼容问题团队学习成本太高从Java 8直接到21团队需要一次性学习10多年的新特性学习成本极高很难落地面试题4从Java 8升级到高版本最容易踩的坑有哪些对应的解决方案是什么答题思路反射访问异常最常见问题高版本Java强封装非法反射访问JDK内部类抛出InaccessibleObjectException解决方案优先升级框架到支持高版本的版本临时方案通过--add-opensJVM参数开放对应模块的访问权限依赖缺失类找不到异常问题Java 11移除了Java EE相关模块JAXB、JAX-WS等低版本Spring Boot等框架会出现类找不到解决方案手动在pom.xml中引入对应的第三方依赖比如jaxb-api、jaxb-impl等GC参数失效问题Java 8的很多GC参数在高版本中被移除、废弃、改名比如CMS相关的参数、PermSize相关参数启动会报错解决方案梳理JVM参数移除废弃的参数替换为高版本对应的参数比如用G1/ZGC替代CMS第三方工具不兼容问题APM工具、日志组件、序列化框架、代码生成工具等不支持高版本Java解决方案升级第三方工具到支持高版本的版本替换不再维护的工具语法/API不兼容问题高版本移除了一些过时的API比如sun.misc.BASE64Encoder代码编译报错解决方案替换为官方公开的API比如用java.util.Base64替代BASE64Encoder字节码增强不兼容问题低版本的ASM、Javassist、CGLIB等字节码增强框架不支持高版本的字节码版本动态代理、AOP失效解决方案升级字节码增强框架到最新版本升级Spring、MyBatis等依赖字节码增强的框架

更多文章