JDK 1.8 到 JDK 17 的主要更新内容总结

817 阅读17分钟

from:无尘

mail:refdust@gmail.com

前言

近期部门讨论要从万年老八升级到17,跟随潮流,升级到boot3,所以就简单整理了这份文档。

概要

JDK 1.8

新增特性

  • Lambda表达式和函数式接口
  • Stream API
  • 接口的默认方法和静态方法
  • 重复注解
  • 改进的类型推断
  • 改进的集合类
  • Nashorn引擎
  • Date and Time API(JSR 310)

JDK 9

移除特性

  • PermGen space

新增特性

  • 模块化系统(Project Jigsaw)
  • JShell: REPL工具
  • 多版本兼容JAR文件
  • 钻石操作符<>
  • private 方法在接口中
  • Try-with-resources改进:支持effectively final变量
  • HTTP/2客户端
  • Multi-Resolution ImagesAPI
  • 钻石继承操作符<>

JDK 10

新增特性

  • var 关键字
  • 局部变量类型推断
  • 增强 @Deprecated
  • Unmodifiable Collections
  • ThreadLocal的改进
  • 增强Stream API
  • Optional的改进
  • 增强JDK编译器
  • 并行全垃圾回收器ZGC(Z Garbage Collector)

JDK 11

移除和弃用特性

  • Java EE和CORBA模块被移除
  • 废弃* Nashorn JavaScript引擎

新增特性

  • ZGC:一款低延迟的垃圾回收器(GA)
  • Epsilon:一个空的垃圾回收器
  • 增强var的作用域
  • 新的HTTP Client(Standard)
  • TLS 1.3支持
  • ZGC并行全垃圾收集器
  • 长期支持版本(LTS)

JDK 12

新增特性

  • Switch 表达式
  • File.length()方法返回类型更改为long
  • 完成委托模式
  • Shenandoah:低延迟垃圾收集器(GA )
  • Microbenchmark套件

JDK 13

新增特性

  • java.util.Objects类添加了isNull、 nonNull和checkFromIndex方法
  • 额外的功能以简化通用数据类型(Numbers、Strings和Characters )的使用
  • 增强final变量语义
  • 增强 switch表达式
  • Socket选项API和Socket流API更新
  • 废弃的方法已从Thread中删除

JDK 14

新增特性

  • 更强大的模式匹配Switch(预览版)
  • 形式主要用于记录模式和类型模式的模式匹配(预览版)
  • Helpful NullPointerExceptions
  • 由于最终引用的更改,增加了对更丰富的空检查API的支持。
  • 并行扫描GC算法
  • 除法操作符改进

JDK 15

新增特性

  • 文本块(第二预览版)
  • 隐藏类
  • 移除了对 Applet 和 Java Web Start 的支持
  • ZGC 改进
  • 轻量级字符串去重
  • 序列化过滤器框架(预览版)
  • 更好的控制台转换和编码置换数据
  • Edwards-Curve Digital Signature Algorithm (EdDSA)
  • 弃用RMI激活

JDK 16

新增特性

  • 纯原生HTTP客户端(Incubator)
  • 向量API (Incubator)
  • 多行字符串(改进)
  • 记录模式(改进)
  • 隐藏类改进
  • Linux/AArch64端口
  • 实验性版JDK Flight Recorder
  • ZGC改进

JDK 17

新增特性

  • 矢量API (GA)
  • 多行字符串(GA)
  • 增强switch(Preview)
  • 模式匹配for instanceof(Preview)
  • 纯原生HTTP Client(GA)
  • 实验性版本的JDK Flight Recorder (GA)
  • Linux ARM32端口
  • 移除对MIPS32的支持
  • 废弃Java Web Start
  • ZGC改进
  • JDK Mission Control 7
  • JDK JFR Event Streaming 可以看出,从JDK 9开始,Oracle针对Java SE进行了良好的规划,每次版本更新都有明确的主题与目标:- JDK 9: 模块化和Jigsaw
  • JDK 10: 局部变量类型推断,var, etc.
  • JDK 11: ZGC, Epsilon, LTS
  • JDK 12: Switch 表达式
  • JDK 13: 文本块(第一预览版)
  • JDK 14: 更强大的模式匹配Switch(预览版)
  • JDK 15: 文本块(第二预览版), 隐藏类
  • JDK 16: 纯原生HTTP客户端, 向量API
  • JDK 17: 矢量API, 多行字符串,增强switch 从JDK 9开始,Java也进入了快速的发布节奏,每6个月发布一个版本。这有利于Java语言及其生态系统的快速迭代升级。同时,也可以看到新特性的引入大多采用预览版机制,并在下一版本及其发布GA版本。这种渐进式的特性引入方式,有利于社区逐渐掌握和采用新特性,不会产生太大的学习成本与移行难度。总的来说,JDK 8之后,Java语言及其平台的变化越来越快,但变化的引入也越来越渐进和可控。从长期来看,Java生态系统的稳定性和活力良好结合,这将是Java语言持续成功的关键。希望这个JDK版本更新内容的总结能够对你有所帮助,让你对Java语言自JDK 8之后的变化与发展有一个比较全面的认识。如果有任何疑问或需要更详尽的内容,请 feel free 与我讨论。我很乐意进行更深入的解答和交流。请let me know如果您有任何其他问题。我很乐意提供Java技术相关的知识支持和帮助。

JDK 1.8

Lambda表达式和函数式接口

Lambda 表达式基于数学中的λ抽象,允许把函数作为一个方法的参数(函数作为参数传递)。使用 Lambda 表达式可以使代码变的更加简洁紧凑。

Stream API

Stream API 像一个 conveyor belt 或者 pipeline,使用 Stream 可以在管道中处理数据。这种风格让程序员可以用声明式方式处理数据集合。

接口的默认方法和静态方法

默认方法使得接口也可以具有实现,解决了接口升级的兼容性问题。静态方法使得接口也可以提供与实现无关的工具方法。

重复注解

在同一个申明上允许多次使用同一个注解。

改进的类型推断

Diamond 语法可以让编译器推断出泛型类型,减少冗长的重复代码。

改进的集合类

List, Set, Map, Deque 等接口及其实现类得到扩展,以更好支持Lambda。

Nashorn引擎

Nashorn是一个轻量级的高性能JavaScript引擎,它使用了最新的ECMAscript标准,并且是OpenJDK的一部分。

Date and Time API(JSR 310)

新的时间日期API (JSR 310)提供了一个全面基于ISO8601标准的日期与时间模型。

JDK 9

模块化系统(Project Jigsaw)

模块系统的主要目标是强 ENCAPSULATION,可靠的 CONFIGURATION 以及强大的 VERSIONING 能力。模块化改变了javac和java的工作方式,所有的工具(javac, java)现在编译和解释按模块组织的代码。

JShell: REPL工具

JShell是一个交互式程序开发环境,可以立即执行Java语句和表达式。它提供了一个读取-求值-打印(REPL)循环,可以让你立即尝试一些新编写的代码。

多版本兼容JAR文件

一种新的JAR文件,包含同一个文件路径下不同版本的类文件。这使得同一个应用程序可以使用不同版本的库。

钻石操作符<>

钻石操作符<>用来做类型推断,可以在创建匿名内部类时使用。它能够让编译器自行判断实际的泛型类型,减少冗余的代码。

private 方法在接口中

接口可以拥有私有方法和私有静态方法,只能被接口中的其他方法调用。

Try-with-resources改进:支持effectively final变量

在try-with-resources语句中,被声明为final或effectively final的变量可以作为资源。一个局部变量如果在声明后没有被重新赋值,那么它就是effectively final的。

HTTP/2客户端

JDK 9中新增的HttpClient API,支持HTTP/2,WebSocket等最新的协议。相比HttpURLConnection更高级,更灵活。

Multi-Resolution ImagesAPI

一组工具类用于操作分辨率不同的图像。可以高效容纳多个不同分辨率的图像,并提供最合适用户所需的图像。

钻石继承操作符<>

用于简化参数化类型的继承,可以被子类型继承。

JDK 10

var 关键字

var关键字允许在局部变量类型推断的情况下声明变量。 compiler会根据初始化表达式推断出变量的类型。

局部变量类型推断

在声明局部变量时不需要指定类型,由编译器推断。使用var关键字声明该变量,然后初始化它。

增强 @Deprecated

@Deprecated注解可以用来替换要废弃的API中相同的目标。这提供了一种机制来清楚地表明新方法是旧方法的替代品。

Unmodifiable Collections

java.util.Collections类新增方法 returnsamodifiable wrapper collections that disallow changes through the mutator methods.

ThreadLocal的改进

ThreadLocal的set方法和get方法现在可以接受null值。如果当前线程没有值关联,则返回默认值。

增强Stream API

局部变量类型推断机制运用于Stream API的构建器, Lambda 表达式和方法引用等。

Optional的改进

Optional类新增方法or,orElseThrow,stream等。这些方法让Optional类更易于使用。

增强* JDK*编译器

现代化编译器开启预览功能,包括局部变量类型推断,Lambda的参数类型推断等。

并行全垃圾回收器ZGC(Z Garbage Collector)

ZGC是一个并发、低延迟的垃圾收集器,扩展年轻代和老年代的标记-清理算法来支持并行全堆垃圾收集。

JDK 11

ZGC:一款低延迟的垃圾回收器(GA)

ZGC是一个并发、低延迟的垃圾回收器,扩展年轻代和老年代的标记-清理算法来支持并行全堆垃圾收集。

Epsilon:一个空的垃圾回收器

不实际进行任何内存回收的垃圾收集器,用于调试目的。

增强var的作用域

var关键字不仅可以用在方法内的局部变量声明中,还能用于lambda表达式的参数;用于异常的资源变量;用于增强循环的迭代变量。

新的HTTP Client(Standard)

JDK 9被弃用的HttpURLConnection被移除,标准的HTTP客户端是现在推荐使用的。

TLS 1.3支持

JDK 11支持TRANSPORT LAYER SECURITY (TLS) 1.3 协议标准。TLS 1.3比先前的TLS版本有许多改进,包括更快的连接速度,更强的加密和更简单的代码。

ZGC并行全垃圾收集器

ZGC是在Linux / x64上的一款低延迟的垃圾收集器。ZGC可以在几毫秒内完成应用程序暂停,同时具有高吞吐量,适用于具有延迟SLA的应用程序。

长期支持版本(LTS)

JDK 11被指定为LTS(长期支持)版本,会得到至少8年的支持。2019年9月之后不会再有新的LTS版本,而是采用每2年发布一个新的标准版本的计划。

JDK 12

Switch 表达式

Switch表达式作用于JDK 12中变量声明的一部分,以简化和增强开关语句。 循环和条件判断的机制通过switch表达式得到增强。

File.length()方法返回类型更改为long

File.length()方法的返回类型从int更改为long,以支持大于2GB的文件。

完成委托模式

JDK 12在java.lang.invoke包中引入了一个新的方法来简化委托模式的实现。委托模式的实现得到简化,这有利于函数式接口的应用。

Shenandoah:低延迟垃圾收集器(GA )

Shenandoah是一款临停式的低延迟垃圾收集器,适用于那些对延迟极为敏感的应用场景。

Microbenchmark套件

JDK 12添加了一个新的微基准测试功能,用于构建JDK改进的基准。JMH继续是Java微基准测试的首选库,此功能为JDK本身添加了一套微基准测试。

JDK 13

java.util.Objects类添加了isNull、 nonNull和checkFromIndex方法

isNull、nonNull和checkFromIndex方法被添加到java.util.Objects工具类中,这些方法检查对象是否为null,对象非空以及下标是否在范围内。

额外的功能以简化通用数据类型(Numbers、Strings和Characters )的使用

新增方法使得这些基本类型的使用更为简洁方便。如:Number.parseInt方法会自动识别数字类型,无需再指定进制。

增强final变量语义

对final局部变量的语义进行了增强,如果final局部变量的初始化表达式是其他变量、方法调用或构造函数的引用,则该初始化遵循的代理模式。这简化了委托模式的实现。

增强 switch表达式

在switch表达式的每个case子句中允许使用语句和调用方法。

Socket选项* API*和Socket流API更新

SocketOption API更新支持设置和查询更广泛的套接字选项;Socket流已更新为使用更广泛的套接字选项; 还添加了isReuseAddress()方法。

废弃的方法已从Thread中删除

Thread类中已经废弃的方法是在JDK 12中删除的(如stop()、suspend()、resume()、destroy()等方法)。

JDK 14

更强大的模式匹配Switch(预览版)

增强的Switch表达式现在允许模式和受检查异常作为Switch的控制表达式,这为“模式匹配”添加了支持。

形式主要用于记录模式和类型模式的模式匹配(预览版)

在Switch表达式中介绍了“模式匹配”,允许开关表达式选择和提取记录和类型匹配的元素。

Helpful NullPointerExceptions

有帮助的NullPointerException提供了更具描述性的NullPointerException,指出null值的确切位置。

由于最终引用的更改,增加了对更丰富的空检查* API*的支持。

新增其他有用的空检查方法,如Objects.requireNonNullElse()等。

并行扫描* GC*算法

并行扫描GC算法用于年轻代和老年代的垃圾回收。它可以提高GC的吞吐量,降低延迟。这是CMS和G1之外的又一种选择。

除法操作符改进

整数除法操作符/现在会向零舍入,而不是向下舍入。9/2现在是4,而不是4。

JDK 15

文本块(第二预览版)

文本块是多行字符串的一种更简洁的语法,使用"""来定义。它支持换行和空格保留。

隐藏类

隐藏类使lambda表达式和嵌套类的字节码更加紧凑,有利于方法的内联优化。隐藏类改善了lambda表达式的性能表现。

移除了对 Applet 和 Java Web Start 的支持

Applet和Java Web Start技术已经被废弃很长一段时间了。JDK 15正式移除了对这两项技术的支持。

ZGC 改进

ZGC在JDK 15中有不少改进,包括并行清理阶段的性能提升,以及大对象支持的改进。这可以提高ZGC的吞吐量和降低暂停时间。

轻量级字符串去重

新增String.distinct()方法,可以去除字符串中重复的字符,返回不包含重复字符的字符串。

序列化过滤器框架(预览版)

新增框架,使开发者可以控制或过滤特定类的序列化和反序列化过程。在JDK 15中作为预览版引入。

更好的控制台转换和编码置换数据

控制台现在具有用于 encoding 和 decoding byte sequences之间转换的 API。这使得在不同的字符编码之间转换变得更容易。

Edwards-Curve Digital Signature Algorithm (EdDSA)

EdDSA是一种变化的数字签名算法,它使用椭圆曲线 Ed25519 产生更短的签名,并且更快速、安全。在 JDK 15 中,EdDSA 现在可用于 TLS 和 X.509。

弃用RMI激活

RMI Activation Framework 和 API 已经被废弃。 RMI 激活使得可以从非活动状态重新激活对象,但今天很少使用。

JDK 16

纯原生HTTP客户端(Incubator)

这是JDK 16中引入的新的HTTP Client API的重要更新。它提供了一个易于使用和强大的API来处理HTTP请求和响应。

向量API (Incubator)

该API提供了DenseVector、SparseVector等矢量类型及操作,以支持机器学习和其他技术。这是数值计算的一个基础。

多行字符串(改进)

文本块的语法得到扩展,以支持更多的转义字符,从而改进了多行字符串的体验。

记录模式(改进)

记录模式越来越接近于成为正式的功能。它允许新的Record类型,具有多个组件的聚合。

隐藏类改进

隐藏类在JDK 16中有一定的改进,包括接口方法的隐藏类支持以及对方法参数的更丰富的检查等。这可以进一步提高lambda表达式和嵌套类的性能。

Linux/AArch64端口

JDK 16带来了Linux/AArch64平台的正式支持。AArch64是最为流行的Arm架构,具有高性能和低功耗等优点。

实验性版* JDK* Flight Recorder

JDK Flight Recorder使运行时数据从JDK收集和分析变得更加简单。它提供了一组API,工具和服务用于收集诊断和监控数据。

ZGC改进

ZGC在JDK 16中进一步优化,包括并行evacuation的改进,以降低STW时间,以及YGC和ZGC共享gunnybags等。这进一步增强了ZGC在大堆场景下的性能。

JDK 17

矢量* API* (GA)

矢量API提供矢量类型和操作,以支持机器学习和科学计算。它在JDK 17中达到GA版本。

多行字符串(GA)

多行字符串或文本块的语法现已正式发布,可以作为字符串的一等公民使用。

增强switch(Preview)

Switch表达式的语法得到扩展,允许在Switch的每个case子句中使用带标签的语句和返回值。这增加了Switch的表现力。

模式匹配for instanceof(Preview)

instanceof操作符现在可以与模式匹配结合使用,以在条件测试中同时检查类型并对对象字段进行匹配。这是一个方便的新语法。

纯原生HTTP Client(GA)

在JDK 17中,纯原生HTTP Client API达到GA版本。它提供了一个简单易用的API来处理HTTP请求和响应。

实验性版本的* JDK* Flight Recorder (GA)

JDK Flight Recorder 可以更轻松收集和分析JDK运行时数据。它提供了一套API,工具和服务用于收集诊断和监控数据。在JDK 17中,它达到GA版本。

Linux ARM32端口

JDK 17增加对Linux ARM 32-bit (arm32) 平台的正式支持。

移除对MIPS32的支持

由于MIPS32平台使用度降低,JDK 17移除了对其的支持。

废弃Java Web Start

Java Web Start技术被正式废弃。它曾被用来部署和更新基于Java的应用程序,但现已很少使用。

ZGC改进

ZGC在JDK 17中有一定改进,包括STW时间的进一步减少,以支持更大的Java堆等。ZGC在大容量内存场景下的性能得到提升。

JDK Mission Control 7

JDK 17中带来JDK Mission Control 7性能监控工具的更新版本。它提供了强大的JDK诊断和监控能力。

JDK JFR Event Streaming

JDK Flight Recorder (JFR) 事件流使JFR事件可以直接通过 HTTP 进行stremaing。这为监控Mission Control等工具提供了更实时的JDK诊断数据。

小结

从JDK 8开始,Java语言及其平台的变化可以说是日新月异。特性不断加入,发布节奏也在加快。但变化的引入也更加渐进和可控,这使得生态系统可以顺畅地吸收这些变化,而不会产生太大的迁移难度。

如果要归纳Java这些年的主要变化方向,可以归为以下几个方面:

  1. 语言层面:Lambda表达式、接口的默认方法、Switch表达式、记录模式、文本块、var类型推断等使语言更加简洁和表现力更强。
  2. API层面:Stream API、Optional、矢量API、原生HTTP Client等丰富的API不断加入,提高开发人员的生产力。
  3. 平台层面: modularity、ZGC、Shenandoah、Epsilon等对JVM和平台的改进持续进行,以满足应用的高性能、低延迟等需求。
  4. 工具层面:JShell、JDK Flight Recorder、JDK Mission Control等有力的工具不断发展,帮助开发者更高效地工作。

综上,Java作为一门语言,正在朝着更简洁、更方便、性能更强以及生态更丰富的方向不断演进。这也使得Java成为当下最流行的编程语言之一,在各个领域得到广泛的使用。我相信,如果 Oracle继续保持这样渐进的变化方式,同时也不断听取来自社区的反馈,Java语言以及生态系统会持续保持旺盛的生命力,服务广大的开发者。毕竟,语言和平台只有不断调整才能真正地与时俱进。