JDK从1995年发布起至今已历经20多年,从JDK1.0升级到JDK19。本文粗略描述了JDK各版本的新特性,仅供参考。
Java官网:https://www.java.com/zh-CN/
Java SE 19
JDK19于2022-09-20发布。
该版本共有7个新特性,4个预览版特性 + 2个处于孵化阶段特性 + 1个新特性。
JDK19带来的7个新特性:
- 405: Record Patterns (Preview) - Record模式(预览)
- 422: Linux/RISC-V Port - Linux/RISC-V移植
- 424: Foreign Function & Memory API (Preview) - 外部函数和内存API(预览)
- 425: Virtual Threads (Preview) - 虚拟线程(预览)
- 426: Vector API (Fourth Incubator) - 向量API(第4次孵化)
- 427: Pattern Matching for switch (Third Preview) - switch模式匹配(第3次预览)
- 428: Structured Concurrency (Incubator) - 结构化并发(孵化)
Java SE 18
JDK18于2022-03-22发布。
JDK18带来的9个新特性:
- 400:默认 UTF-8 字符编码
- 408:简单的 Web 服务器
- 413:Javadoc 中支持代码片段
- 416:使用方法句柄重新实现反射核心功能
- 417:Vector API(三次孵化)
- 418:互联网地址解析 SPI
- 419:Foreign Function & Memory API (第二次孵化)
- 420:switch 表达式(二次孵化)
- 421:弃用删除相关
JDK18新特性详解:
JDK 18 Release Notes:https://www.oracle.com/java/technologies/javase/18-relnote-issues.html#NewFeature
Java SE 17(LTS)
JDK17于2021-09-17发布。
这是继JDK11发布3年以来的又一个长支持(LTS)的版本,其带来了14项JEP(JDK增强建议)更新,包括10个新功能以及2个功能的删除和2个功能的弃用。
Spring Boot 3.0 最低只支持JDK 17,已经不再向下兼容,这就意味着未来很多的开发者必定逐步从JDK8 转到JDK17。
Java 17带来的14 个 新特性:
- 306:恢复始终严格的浮点语义
- 356:增强型伪随机数发生器
- 382:新的 macOS 渲染管道
- 391:macOS/AArch64 端口
- 398:弃用即将删除的 Applet API
- 403:强封装JDK的内部API
- 406:Switch模式匹配(预览)
- 407:删除 RMI 激活
- 409:密封类
- 410:删除实验性 AOT 和 JIT 编译器
- 411:弃用即将删除安全管理器
- 412:外部函数和内存 API(孵化器)
- 414:Vector API(第二次进行特性孵化)
- 415:特定于上下文的反序列化过滤器
Java SE 16
JDK16 于2021-03-16发布。
JDK16为我们带来了17个方面的提升,包括了新的语言特性、新的工具、内存管理的提升等方面。
JDK16的新特性:https://cloud.tencent.com/developer/article/1900076
- 一些在JDK14中引入的新特性,最终在JDK16中确定了。
- 内存管理的提升
- 新的打包工具
- UNIX-Domain Socket channels
- Value-based Classes的警告
- Encapsulating JDK Internals by default
- 提供了 C++ 14语言特性
- 其他的一些预览版本的新特性
Java SE 15
JDK15 于 2020-09-15发布。
JDK15新特性列表:
JDK15新特性详解:
Java15主要有以下几个特性:
- 339:Edwards-Curve Digital Signature Algorithm (EdDSA)
- 360:Sealed Classes (Preview)
- 371:Hidden Classes
- 372:Remove the Nashorn JavaScript Engine
- 373:Reimplement the Legacy DatagramSocket API
- 374:Disable and Deprecate Biased Locking
- 375:Pattern Matching for instanceof (Second Preview)
- 377:ZGC: A Scalable Low-Latency Garbage Collector
- 378:Text Blocks
- 379:Shenandoah: A Low-Pause-Time Garbage Collector
- 381:Remove the Solaris and SPARC Ports
- 383:Foreign-Memory Access API (Second Incubator)
- 384:Records (Second Preview)
- 385:Deprecate RMI Activation for Removal
Java SE 14
JDK 14于 2020-03-17发布。
JDK 14 中新增了以下16个新特性:
- 305: instanceof的模式匹配 (预览)
- 343: 打包工具 (Incubator)
- 345: G1的NUMA内存分配优化
- 349: JFR事件流
- 352: 非原子性的字节缓冲区映射
- 358: 友好的空指针异常
- 359: Records (预览)
- 361: Switch 表达式 (标准)
- 362: 弃用Solaris和SPARC端口
- 363: 移除 CMS (Concurrent Mark Sweep)垃圾收集器
- 364: macOS 系统上的ZGC
- 365: Windows系统上的ZGC
- 366: 弃用ParallelScavenge + SerialOld GC组合
- 367: 移除Pack200 Tools和API
- 368: 文本块 (第二个预览版)
- 370: 外部存储器API (Incubator)
Java SE 13
JDK 13 于2019-07-17 发布。
该版本通过改善Java SE平台和JDK的性能,稳定性和安全性来提高开发人员的生产力。这次的JDK13包含了5个JEP(Java Enhancement Proposals)和一个Unicode 12.1的支持总共6大主要新特性。
JDK13的六大重要特性:
- 支持Unicode 12.1
- 动态CDS归档(Dynamic CDS Archiving)
- java.net.Socket和java.net.ServerSocket API的重新实现
- ZGC的增强
- 文本块(预览语言功能)
- switch表达式(预览语言功能)
JDK13 新特性详解:
Java SE 12
JDK 12 于 2019-03-20 发布。
只包含8个JEP,其中主要有Switch表达式、Java微测试套件(JMH)等新功能,最引人注目的特性无疑是加入了由RedHat领导开发的Shen-andoah垃圾收集器。Shenandoah作为首个由非Oracle开发的垃圾收集器,目标又与Oracle在JDK 11中发布的ZGC几乎完全一致,两者天生就存在竞争。
Java 12 的 8 项关键新特性(JEP):
1. JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental) (Shenandoah:低暂停时间的 GC(实验性功能))
新增了一个名为 Shenandoah 的 GC 算法,通过与正在运行的 Java 线程同时进行 evacuation 工作来减少 GC 暂停时间。使用 Shenandoah 的暂停时间与堆大小无关,这意味着无论堆是 200MB 还是 200GB,都将具有相同的暂停时间。
2. JEP 230: Microbenchmark Suite(微基准测试套件)
JDK 源码中新增了一套微基准测试套件,开发人员可通过它轻松运行已有的微基准测试并创建新的基准测试。
3. JEP 325: Switch Expressions (Preview) (Switch 表达式(预览功能))
对 switch 语句进行了扩展,使其不仅可以作为语句(statement),还可以作为表达式(expression),并且两种写法都可以使用传统的 switch 语法,或者使用简化的 "case L ->" 模式匹配语法作用于不同范围并控制执行流。这些更改将简化日常编码工作,并为 switch 中的模式匹配(JEP 305)做好准备。
4. JEP 334: JVM Constants API(JVM 常量 API)
引入 API 来对关键类文件(key class-file)和运行时工件(run-time artifacts)的名义描述(nominal descriptions)进行建模,特别是可从常量池加载的常量。
在新的 java.lang.invoke.constant 包中定义了一系列基于值的符号引用(JVMS 5.1)类型,它们能够描述每种可加载常量。
符号引用以纯 nominal 形式描述可加载常量,与类加载或可访问性上下文区分开。有些类可以作为自己的符号引用(例如 String),而对于可链接常量,定义了一系列符号引用类型(ClassDesc、MethodTypeDesc、MethodHandleDesc 和 DynamicConstantDesc),它们包含描述这些常量的 nominal 信息。
5. JEP 340: One AArch64 Port, Not Two(只保留一个 AArch64 实现)
在保留 32 位 ARM 实现和 64 位 aarch64 实现的同时,删除与 arm64 实现相关的所有源码。
JDK 中存在两套 64 位 ARM 实现,主要存在于 src/hotspot/cpu/arm 和 open/src/hotspot/cpu/aarch64 目录。两者都实现了 aarch64,现在将只保留后者,删除由 Oracle 提供的 arm64。这将使贡献者将他们的精力集中在单个 64 位 ARM 实现上,并消除维护两套实现所需的重复工作。
6. JEP 341: Default CDS Archives(默认类数据共享归档文件)
针对 64 位平台,使用默认类列表增强 JDK 构建过程,以生成类数据共享(class data-sharing,CDS)归档。
7. JEP 344: Abortable Mixed Collections for G1(可中止的 G1 混合 GC)
如果混合 GC 的 G1 存在超出暂停目标的可能性,则使其可中止。
8. JEP 346: Promptly Return Unused Committed Memory from G1 (G1 及时返回未使用的已分配内存)
增强 G1 GC,以便在空闲时自动将 Java 堆内存返回给操作系统。
为了实现向操作系统返回最大内存量的目标,G1 将在应用程序不活动期间定期执行或触发并发周期以确定整体 Java 堆使用情况。这将导致它自动将 Java 堆的未使用部分返回给操作系统。而在用户控制下,可以可选地执行完整的 GC,以使返回的内存量最大化。
Java SE 12 新增特性:
Java SE 11(LTS)
JDK 11 于2018-09-25 发布,这是一个LTS版本的JDK。
该版本有ZGC这样的革命性的垃圾收集器出现,也有把JDK 10中的类型推断加入Lambda语法这种可见的改进。InfoQ:Java 11 正式发布,新特性解读
Java 11 的 17 项关键新特性(JEP):
- 181 嵌套类可见性控制
- 309 动态文件常量
- 315 改进 Aarch64 Intrinsics
- 318 Epsilon–一个无操作的垃圾收集器
- 320 删除 Java EE 和 CORBA 模块
- 321 HttpClient
- 323 用于 Lambda 参数的局部变量语法
- 324 Curve25519 和 Curve448 算法的密钥协议
- 327 Unicode 10
- 328 Flight Recorder(飞行记录器)
- 329 haCha20 和 Poly1305 加密算法支持
- 330 Launch Single-File Source-Code Programs(启动单一文件的源代码程序)
- 331 低开销的 Heap Profiling
- 332 TLS 1.3支持
- 333 ZGC: A Scalable Low-Latency Garbage Collector(可伸缩低延迟垃圾收集器)
- 335 弃用 Nashorn JavaScript 引擎
- 336 弃用 Pack200 工具和 API
JDK11 新特性详解:
Java SE 10
JDK 10 于2018-03-20 如期发布。
该版本的主要研发目标是内部重构,诸如统一源仓库、统一垃圾收集器接口、统一即时编译器接口(JVMCI在JDK 9已经有了,这里是引入新的Graal即时编译器)等,这些都将会是对未来Java发展大有裨益的改进,但对普通用户来说JDK 10的新特性就显得乏善可陈,毕竟它只包含了12个JEP,而且其中只有本地类型推断这一个编码端可见的改进。
Java 10 的 12 项关键新特性:
- JEP 286: 局部变量的类型推断。该特性在社区讨论了很久并做了调查,可查看 JEP 286 调查结果
- JEP 296: 将 JDK 的多个代码仓库合并到一个储存库中
- JEP 304: 垃圾收集器接口。通过引入一个干净的垃圾收集器(GC)接口,改善不同垃圾收集器的源码隔离性。
- JEP 307: 向 G1 引入并行 Full GC
- JEP 310: 应用类数据共享。为改善启动和占用空间,在现有的类数据共享(“CDS”)功能上再次拓展,以允许应用类放置在共享存档中
- JEP 312: 线程局部管控。允许停止单个线程,而不是只能启用或停止所有线程
- JEP 313: 移除 Native-Header Generation Tool (javah)
- JEP 314: 额外的 Unicode 语言标签扩展。包括:cu (货币类型)、fw (每周第一天为星期几)、rg (区域覆盖)、tz (时区) 等
- JEP 316: 在备用内存设备上分配堆内存。允许 HotSpot 虚拟机在备用内存设备上分配 Java 对象堆
- JEP 317: 基于 Java 的 JIT 编译器(试验版本)
- JEP 319: 根证书。开源 Java SE Root CA 程序中的根证书
- JEP 322: 基于时间的版本发布模式。“Feature releases” 版本将包含新特性,“Update releases” 版本仅修复 Bug
学习参考文章:
Java SE 9
JDK 9版本的开发代号是Elephant(巨象),于2017-09-22发行。
原本JDK 9是计划在2016年发布的,但在2016年伊始,Oracle就宣布JDK 9肯定要延期至2017年,
后来又连续经过了两次短时间的跳票,最终到2017年9月21日才得以艰难面世。
JDK 9带着Jigsaw最终发布了,除了Jigsaw外,JDK 9还增强了若干工具(JS Shell、JLink、JHSDB等),整顿了HotSpot各个模块各自为战的日志系统,支持HTTP 2客户端API等91个JEP。
JDK 9 提供了超过 150 项新功能特性,包括备受期待的模块化系统、可交互的 REPL 工具:jshell,JDK 编译工具,Java 公共 API 和私有代码,以及安全增强、扩展提升、性能管理改善等。可以说 JDK 9 是一个庞大的系统工程,完全做了一个整体改变。
引入的新特性包括:
1. 平台级modularity(原名:Jigsaw) 模块化系统
2. Java 的 REPL 工具: jShell 命令
3. 多版本兼容 jar 包(这个在处理向下兼容方面,非常好用)
4. 语法改进:接口的私有方法
5. 语法改进:UnderScore(下划线)使用的限制
6. 底层结构:String 存储结构变更(这个很重要)
7. 集合工厂方法:快速创建只读集合
8. 增强的 Stream API
9. 全新的 HTTP 客户端 API
10. 其它特性
深入理解JDK 9 提供的新特性:
JDK 9 的重大革新,也阻碍了大多数项目的升级,让 JDK 8 成了许多开发者心中的 YYDS。JDK 9 的新特性,可以参考以下系列文章:
- java9系列(一)安装及jshell使用
- java9系列(二)docker运行java9
- java9系列(三)模块系统精要
- java9系列(四)Process API更新
- java9系列(五)Stack-Walking API
- java9系列(六)HTTP/2 Client (Incubator)
- java9系列(七)Variable Handles
- java9系列(八)Multi-Release JAR Files
- java9系列(九)Make G1 the Default Garbage Collector
- java9 opens与exports的区别
Java SE 8(LTS)
JDK8版本的开发代号是Dolphin(海豚),于2014-03-18发行。
- JDK 8的第一个正式版本原定于2013年9月发布,最终还是跳票到了2014年3月18日。
- JDK 8提供了那些曾在JDK 7中规划过,但最终未能在JDK 7中完成的功能。
该版本带来了全新的Lambda表达式,函数式接口、Lambda 表达式、集合的流式操作、注解的更新、安全性的增强、IO\NIO 的改进、完善的全球化功能等。
引入的新特性包括:
- Lambda表达式
2. 改进的类型推断
3. Java类型的注释
4. 重复注释
5. 方法参数反射
6. TLS 1.1和TLS 1.2默认启用
7. 有限的doPrivileged
8. 基于密码加密的更强算法
9. JSSE服务器中的SSL / TLS服务器名称指示(SNI)扩展支持
10. 支持AEAD算法
11. KeyStore增强功能
12. SHA-224消息摘要
13. 对NSA Suite B加密的增强支持
14. 对于高熵随机数生成更好的支持
15. 新PKIXRevocationChecker类
16. 适用于Windows的64位PKCS11
17. Kerberos中的新rcache类型5重放缓存
18. 协议转换和约束委派的Kerberos 5
19. 默认情况下禁用弱加密
20. GSS-API / Kerberos 5机制的未绑定SASL
21. 用于多个主机名的SASL服务
22. JNI桥接到Mac OS X上的本机JGSS
23. 在SunJSSE提供程序中支持更强大的临时DH密钥
24. 支持JSSE中的密码套件首选项自定义
25. 全新的JavaFX
26. Java工具的操作增强
27. Unicode增强功能,包括对Unicode 6.2.0的支持
28. 采用Unicode CLDR数据和java.locale.providers系统属性
29. 新日历和区域设置API
30. 引入新的Date Time API
31. Nashorn JavaScript引擎
32. 并行阵列排序
33. 标准编码和解码Base64
34. 无符号算术支持
35. 新的并发
36. Java XML技术增强功能
37. 虚拟机操作增强
JDK8新特性中的API用法可参考以下文章,了解更多:
Java SE 7
JDK7版本的开发代号是Dolphin(海豚),于2011-07-28发行。Oracle收购Sun公司后,随即宣布大幅裁剪了JDK 7预定目标,以保证JDK 7的正式版能够于2011年7月28日准时发布。
该版本引入了二进制整数、支持字符串的switch语句、菱形语法、多异常捕捉、自动关闭资源的try语句等新特性。提供新的G1收集器(G1在发布时依然处于Experimental状态,直至2012年4月的Update 4中才正式商用)、加强对非Java语言的调用支持(JSR-292,这项特性在到JDK 11还有改动)、可并行的类加载架构等。
引入的新特性包括:
- switch 语句支持 String 字符串
- 泛型对象类型推断 - 调用泛型类的构造方法时,可以省去泛型参数,编译器会自动判断。
- catch 多个异常捕获 - 多个异常通过使用 “|”操作符分隔
- 支持动态语言
- 改进泛型类型可变参数
- 语法上支持集合而不一定是数组
- 新增获取环境信息的工具方法
- boolean类型反转:空指针安全,参与位运算
- 两个char之间的equals方法
- 安全的加减乘除
- Java集合(Collections)增强 - map集合支持并发请求
- 引入Java NIO.2开发包
- 数值可以加下划线用作分隔符
- null值得自动处理
- 简化了可变参数方法的调用
- 提供GI收集器
- 加强对非Java语言的调用支持(JSR-292,升级类加载架构)
Java SE 7 Features and Enhancements(官方介绍):https://www.oracle.com/java/technologies/javase/jdk7-relnotes.html
JDK7新特性代码演示:
Java SE 6
JDK6版本的开发代号为Mustang(野马),于2006-12-11发行。
该版本引入了一个支持脚本引擎的新框架、UI的增强、对WebService支持的增强(JAX-WS2.0和JAXB2.0)、一系列新的安全相关的增强、JDBC4.0、Compiler API、通用的Annotations支持。
提供初步的动态语言支持(通过内置Mozilla JavaScript Rhino引擎实现)、提供编译期注解处理器和微型HTTP服务器API,等等。
这个版本对Java虚拟机内部做了大量改进,包括锁与同步、垃圾收集、类加载等方面的实现都有相当多的改动。
引入的新特性包括:
- 命名方式变动
- 脚本语言支持
- 编译API和微型HTTP服务器API
- 锁与同步
- 垃圾收集
- 类加载
- JDBC 4.0(jdbc高级)
- Java Compiler (Java™ 编程语言编译器的接口)
- 可插拔注解
- Native PKI(公钥基础设)
- Java GSS (通用安全服务)
- Kerberos ( 一种安全认证的系统)
- LDAP (LDAP )
- Web Services (web服务即xml传输)
- JTable的排序和过滤
- 嵌入式数据库 Derby
推荐阅读文章:
Java SE 5
JDK1.5版本的开发代号为Tiger(猛虎),于2004-09-30发行。
这是一个万众期待的版本,同时,Sun将JDK1.5改为Java 5.0,J2EE、J2SE和J2ME也相应的改为Java SE、Java ME、Java EE。增加了泛型、增强for循环、可变数量的形参、注解(Annotations)、自动拆箱和装箱等功能;发布新的企业级平台规范,如通过注释等新特性来简化EJB的复杂性,并推出EJB3.0规范,还推出了自己的MVC框架规范:JSF。
JDK 5在Java语法易用性上做出了非常大的改进。如:自动装箱、泛型、动态注解、枚举、可变长参数、遍历循环(foreach循环)等语法特性都是在JDK 5中加入的。在虚拟机和API层面上,这个版本改进了Java的内存模型(Java Memory Model,JMM)、提供了java.util.concurrent并发包等。另外,JDK 5是官方声明可以支持Windows 9x操作系统的最后一个JDK版本。
引入的新特性包括:
- 泛型(Generic)
- For-Each循环
- 自动装箱与拆箱
- 类安全枚举 (Enum)
- 可变参数(Varargs)
- 静态导入(import static)
- 元数据注解(Annotation)
- 内省(Introspect)
- 内存模型(JMM)
- 并发包(java.util.concurrent)
Java SE 1.4
JDK1.4版本的开发代号为Merlin(隼),于2002-02-13发行(首次在JCP下发行)。
2002年2月发布此版本,是JDK历史上最为成熟的版本。此时Compaq、Fujitsu、SAS、Symbian、IBM等公司的参与,使JDK1.4成为发展最快的一个JDK版本。JDK1.4已经可以使用Java实现大多数的应用。
在此期间,Java语言在企业应用领域大放异彩,涌现大量基于Java语言的开源框架:Struts、WebWork、Hibernate、Spring等;大量企业应用服务器也开始涌现:WebLogic、WebSphere、JBoss等。
Classic VM退出历史舞台。
引入的新特性包括:
- XML处理
- Java打印服务
- 日志API(Logging)
- Java Web Start
- JDBC 3.0 API
- 断言机制
- 参数API (Preferences)
- 链式异常处理
- 支持IPV6
- 正则表达(Regular)
- image I/O API
- NIO(高级流)
Java SE 1.3
JDK1.3版本的开发代号为 Kestrel(红隼),于2000-0508发行。
该版本的改进主要体现在Java类库上(如数学运算和新的Timer API等),JNDI服务从JDK 1.3开始被作为一项平台级服务提供(以前JNDI仅仅是一项扩展服务),使用CORBA IIOP来实现RMI的通信协议等。JDK1.3 对Java的各个方面都做了大量优化和增强。
Hotspot 做为默认虚拟机发布。
引入的新特性包括:
- 数学运算
- Timer API(时间)
- Java Sound API(声音)
- CORBA IIOP实现RMI的通信协议
- Java 2D新特性
- JAR文件索引
Java SE 1.2
JDK1.2版本的开发代号为Playground(竞技场),于1998-12-04发行。
JDK1.2是一个里程碑式的重要版本,Sun在这个版本中把Java技术体系拆分为三个方向,分别是面向桌面应用开发的J2SE(Java 2 Platform,Standard Edition)、面向企业级开发的J2EE(Java 2 Platform,Enterprise Edition)和面向手机等移动终端开发的J2ME(Java 2 Platform,Micro Edition)。
在语言和API层面上,Java添加了strictfp关键字,Java类库添加了现在Java编码之中极为常用的一系列Collections集合类等。
JDK1.2 Solaris Exact VM,附带JIT解释器,提升GC性能,精准内存管理(Accurate Memory Management),数据类型敏感等特性。但其生命周期很短暂,很快被Hotspot取代。
此外还引入新特性:
- 集合框架
- 字符串常量做内存映射
- JIT编译器 (Just In Time)
- 对打包Java文件数字签名
- 控制授权访问系统资源的策略工具
- JFC(Java Foundation Classes) Swing 1.0, 拖放和Java2D类库
- Java插件
- JDBC可滚动结果集,BLOB、CLOB、批量更新和用户自定义类型
- Applet中添加声音支持
Java SE 1.1
JDK1.1版本的开发代号为Coffce(咖啡),于1997-02-19发行。
该版本增加了JIT(Just In Time,即时编译)编译器,相对于传统编译器,它会将经常用到的指令保存到内存中,当下次调用的时候不需要重新编译了,此方式让JDK在效率上有了较大优势。
此外还引入新特性:
- JAR - jar包
- JDBC (Java Database Connectivity)- 数据库连接规范
- 内部类(Inner Class)
- Java Beans
- RMI(Remote Method Invocation)- 远程调用
- 反射 (Reflection)
Java SE 1.0
JDK1.0版本的开发代号为Oak(橡树),于1996-01-23发行。
Sun公司在1995年初发布了Java语言,1996年初发布JDK 1.0版本。这是一个伟大的里程碑,纯解释运行,使用外挂JIT,性能比较差,运行速度慢。
此版本包括两个部分:运行环境(即Java Runtime Environment, JRE)和开发环境(Java Development Kit,JDK)。运行环境包括核心API、集成API、用户界面API、发布技术、Java虚拟机(Java Virtual Machine,JVM)五个部分;其中开发环境包括编译Java程序的编译器(javac 命令)。