# java-8-to-21-features **Repository Path**: jayung/java-8-to-21-features ## Basic Information - **Project Name**: java-8-to-21-features - **Description**: java-8-to-21-features - **Primary Language**: Java - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 9 - **Forks**: 0 - **Created**: 2023-09-06 - **Last Updated**: 2025-09-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # java 8到21新特性一览,以及未来新特性展望 ## JDK下载 * JDK17(LTS,长期支持版本): https://jdk.java.net/archive/ * JDK21(LTS,长期支持版本): https://jdk.java.net/archive/ * JDK24(支持期6个月): https://jdk.java.net/24/ * JDK25: 是下一个长期支持版本,将于2025年9月发布 注:JDK17和JDK21是长期支持版本。JDK24是2025年3月发布的最新JDK,维护期是半年,如使用于生产环境,建议跟随JDK的节奏一路升。 ## java8(2014年) 大量新特性,主要有: * 函数式编程:lambda表达式、方法引用 * 流式计算Stream * 可空容器Optional * 工具类:Files、Base64 * CompletableFuture快捷异步工具 * 默认接口方法 * 全新时间api:LocalDate、LocalDateTime、Instant等。java.util.Date、SimpleDateFormat、Calender可以不用了。 全整示例见: `com.jiayuan.feature.java8` 运行单个单元测试即可体验用法 ## java11(2018年9月) java8之后,java的版本发布方式改为小步快跑,允许一个实验性的预览项目提前与用户相见,但需要指定JVM参数 `--enable-preview` 才能使用。 java11是java8之后的一个长期支持版本,`com.jiayuan.feature.java11` 里包含了java9、java10、java11三个版本特性的用法,主要有: * 模块化:通过定义module-info.java来开启模块化功能,里面可申明要依赖的jdk模块、外部模块、开放反射写权限的包、SPI申明等 * 构建List/Map更方便了:List.of、Map.of快速构建不可变List/Map。 * try-with-resource里定义变量,实现了Autoclose接口的类,不用在末尾手动close()了 * JDK内置了HttpClient,可告别apache httpclient、restTemplate、retrofit、okhttp等第三方http client包了。 * 对Optional增强了ifPresentOrElse()等方法 * 与操作系统有关的ProcessHandle、ProcessBuilder,能通过JDK来调用系统进程 * MethodHandle、VarHandle:增强了方法句柄、变量句柄的功能,使用反射更便捷。 * var:局部变量关键词,自动推断类型 * 服务于Reactive Programming的全新Flow API:Publisher/Subscriber模型 ## java17(2021年9月) java11之后,JCP(即Java社区委员会)正式确定每半年一个非长期支持版本,主要目的是新特性可以更快发布出来,有兴趣的开发者可以提早尝鲜新特性,并反馈使用效果和意见至Java社区,在后面的版本做升级。 每3年一个长期支持版本(LTS)。Java17是LTS,`com.jiayuan.feature.java17` 包含了java12、java13、java14、java15、java16、java17这6个版本特性的用法,主要有: * 文本块:多行文本无需加号和双引号拼接,多行文本更方便,代码里的文本块所见即所得,更整洁。 * record类:记录类,只读,不可修改属性值,告别getter/setter/lombok,一行代码即可申明一个对象,可用于数据对象申明。 * sealed class:密封类,子类可被枚举,仅对指类的子类开放继承权、实现权。 * 明确的空指针对象:抛异常时,会告知具体是哪个对象为null导致的NullPointerException * switch表达式:写法更精简,还可以做为赋值语句把整个switch当成一个值。 * 模式匹配:模式匹配后支持变量定义,告别cast强转 * Stream to List更简单 * ZGC:Zero GC,号称零卡顿垃圾回收器 ## java21(2023年9月) java17之后,经JCP会员投票,Java的版本3年一个LTS太久了,改为了两年一个LTS。java17之后的LTS就是21,21之后的LTS是将在2025年9月发布的Java25。 `com.jiayuan.feature.java21` 包含了java18、java19、java20、java21这4个版本特性的用法,主要有: * 虚拟线程:轻量级线程,也称java版协程,性能不低于go的协程,大幅提升IO吞吐型互联网应用的并发能力。消耗很小的资源即可进行多线程编程,无需池化,告别线程池数量调参 * switch里支持模式匹配、支持对record模式匹配 * List取第一个、最后一个元素、反转List更方便了 * SimpleFileServer:轻量级http web server,可做java版nginx,支持本地二级目录路由、反向代理等。 * 分代ZGC:对ZGC进行了分代回收。 ## java22(2024年3月) * Foreign Function & Memory API:增强了Java跨语言能力,可替代JNI来调C/C++编译的本地库 * 其他未正式发布的预览特性,见:https://openjdk.org/projects/jdk/22/ ## java23(2024年9月) * 大部分为预览特性,主要变化:原始类型可用于instanceof、switch、record模式匹配,免装箱。 * 详见:https://openjdk.org/projects/jdk/23/ ## java24(2025年3月) 本版本特性很多,大部分是底层优化,语法及开发者主要关注的有: * Class-File API:正式特性,可用来取代第三方库asm的字节码操作 * Stream Gatherers: 允许对流进行窗口操作(如滑动窗口、跳跃窗口等),适用场景:时间序列分析、文本处理、统计连续N个单词的字母数、信号处理里滑动窗口滤波等 * 虚拟线程里使用synchronized不再被pinning:Java21发布了虚拟线程,但对于老旧的第三方库里如果使用了synchronized关键词,在某些情况下会导致虚拟线程被平台线程pin住,24里已经修复此问题。 * 更多详见:https://openjdk.org/projects/jdk/24/ ## Java社区正在研发中的系例项目 * Project Amber:对Java语法进行现代化提升,让java为更简洁、更强表达力,已交付的:模式匹配、switch表达式、字符串模板(回炉改造中)等。在研发的:with 赋值符(简化对象拷贝赋值)... * Project Loom:关注于并发编程的性能提升,已交付的:虚拟线程、scoped value(第四版预览)、结构化并发(第四版预览) * Project Babylon:主要研究:增强反射能力、通过表达式树实现Linq、GPU运算、自动微分、提升数学计算、机器学习等。见: https://openjdk.org/projects/babylon/ * Project Graal:研究Java AOT编译。支持java字节码编译为native二进制可执行文件;用java写javac、JVM;支持Javascript/Python等语言编译为java字节码等。 * Project Valhalla: 值对象、空安全、泛型免装箱拆箱 https://openjdk.org/projects/valhalla/ * Project Panama:增强Java与native的交互能力。主要有:原生高性能向量API、FFM、FFI... * Project Lilliput:缩减Java对象头大小,由96/128减少至64,内存可节省33%至50%,此特性已随Java24发布(实验特性),需加参数开启 * Project Leyden:提升JVM启动性能,缩短预热时间,研究 JIT & AOT 结合编译