概述
JDK8 作为业界经典版本,至今仍是企业中使用最广泛的 JDK 版本。随着 JDK 版本迭代,从 JDK9 开始,JDK 改为每半年推出新版本,每三年推出一个 。本文以 JDK21(最新 LTS 版本)为准,梳理 JDK8 之后的重要新特性,帮助开发者了解 Java 生态的发展方向。
一、语法增强
1. 文本块(Text Blocks)
- 使用三个引号声明长文本块(
""") - 支持
String.format格式化 - 新增转义字符:
\\(行连接)、\\s(单个空白字符)
Stringquery=""" SELECT `EMP_ID`, `LAST_NAME` FROM `EMPLOYEE_TB` WHERE `CITY` = ' %s ' \\ ORDER BY `EMP_ID`, `LAST_NAME`; """;System.out.println(String.format(query,"合肥"));2. Switch 表达式增强
- 扩展
case匹配类型 - 支持
yield关键字提供流程控制 - 语法更简洁,可替代复杂
if-else
inttmp=switch(name){case"李白","杜甫","白居易"->1;case"苏轼","辛弃疾"->2;default->{System.out.println("其他朝代诗人");yield3;}};3. var 自动类型推断
- 用于局部变量类型推断
- 限制:不能用于属性、函数返回值、类型不明确的 Lambda 表达式
varnums=newint[]{1,2,3,4,5};// 自动推断为int[]varsum=Arrays.stream(nums).sum();// 自动推断为int二、重要扩展功能
1. 记录类(record)
- 用于表示不可变数据结构
- 自动生成构造器、getter 方法、
equals、hashCode、toString - 不能通过反射修改值
publicrecordPoint(intx,inty){}Pointp=newPoint(10,20);System.out.println(p.x()+"===="+p.y());2. 隐藏类(Hidden Classes)
- 不能被其他类直接使用的类
- 通过读取目标类字节码创建
- 用于动态类生成,替代 ASM 等字节码操作技术
byte[]classInBytes=Base64.getDecoder().decode(CLASS_INFO);Class<?>proxy=MethodHandles.lookup().defineHiddenClass(classInBytes,true,MethodHandles.Lookup.ClassOption.NESTMATE).lookupClass();3. 密封类(Sealed Classes)
- 限制父类可以被哪些子类继承
- 通过
sealed修饰,配合permits指定可继承的类 - 三种子类类型:
final(不可再继承)、non-sealed(可继承)、sealed(可继续密封)
publicsealedabstractclassShapepermitsCircle,Rectangle,Square{publicabstractintlines();}publicfinalclassCircleextendsShape{@Overridepublicintlines(){return0;}}4. 虚拟线程(Virtual Threads)
- 用户态线程,以用户态多个线程对应内核态一个真实线程
- 极大提升多线程并发能力
- 通过
Executors.newVirtualThreadPerTaskExecutor()创建
try(varexecutor=Executors.newVirtualThreadPerTaskExecutor()){IntStream.range(0,10_000).forEach(i->{executor.submit(()->{System.out.println("Virtual Task"+i+" is running");Thread.sleep(Duration.ofSeconds(1));returni;});});}三、JDK 模块化机制
1. 什么是模块化
- JDK9 开始引入
- 模块化后,JDK 内部功能以
module形式存在 - 可使用
java --list-modules查看系统模块
2. 模块化与类加载机制
- 类加载器调整:
PlatformClassLoader替换ExtClassLoader - 双亲委派机制调整:类加载请求优先委派给对应模块的类加载器
3. 自己实现一个模块
- 在模块根目录创建
module-info.java - 使用
requires声明依赖 - 使用
exports和opens声明对外 API - 使用
provides和uses实现服务提供者接口
moduleroy.demoModule2{exportscom.roy.service;providescom.roy.service.HelloServicewithcom.roy.service.impl.MorningHello,com.roy.service.impl.EveningHello;}四、JDK 的向量计算 API
1. 向量计算简介
- 利用现代 CPU 的 SIMD 指令进行高效并行计算
- SIMD:Single Instruction Multiple Data(单指令多数据)
2. 使用方式
- 需要引入模块:
requires jdk.incubator.vector; - 使用
VectorSpecies定义向量形状 - 使用向量操作进行高效计算
VectorSpecies<Float>species=FloatVector.SPECIES_256;varva=FloatVector.fromArray(species,newfloat[]{1,2,3,4,5,6,7,8,9},1);varvb=FloatVector.fromArray(species,newfloat[]{8,7,6,5,4,3,2,1},0);varvc=va.mul(vb);System.out.println(vc);五、GC 垃圾回收器优化
1. GC 算法演进
- JDK15:默认废弃偏向锁
- JDK17:仍可手动开启偏向锁(
XX:+UseBiasedLocking) - JDK21:移除偏向锁相关参数
2. 垃圾回收器变化
- CMS 被废弃(JDK14 彻底删除)
- SerialOld 被废弃
- ZGC 转正(JDK11 引入,JDK15 正式使用)
- Shenandoah 集成(非官方,但被 Oracle 接受)
3. 当前默认 GC
- JDK21 版本默认垃圾回收器依然是 G1
六、GraalVM
1. GraalVM 简介
- 由 Java 语言编写,用于替代 HotSpot 的 C1/C2 编译器
- 可将 Java 应用程序编译成机器语言,绕过 class 文件翻译过程
- 提升应用启动速度
2. GraalVM 优势
- 云原生架构下,提升启动速度和预热时间
- 通过 Truffle 框架可快速实现自定义编程语言
- 与 Spring 框架逐步兼容
总结
JDK 从 8 到 21 的演进,体现了 Java 生态在语法、性能、模块化和云原生适应性方面的持续进步。虽然 JDK8 仍是企业主流版本,但 JDK17 和 JDK21 作为 LTS 版本,已为 Spring6/SpringBoot3 等框架提供了支持。了解这些新特性,不仅能帮助开发者跟上技术发展,还能在实际项目中选择更优的解决方案,提升应用性能和可维护性。