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这些年的主要变化方向,可以归为以下几个方面:
- 语言层面:Lambda表达式、接口的默认方法、Switch表达式、记录模式、文本块、var类型推断等使语言更加简洁和表现力更强。
- API层面:Stream API、Optional、矢量API、原生HTTP Client等丰富的API不断加入,提高开发人员的生产力。
- 平台层面: modularity、ZGC、Shenandoah、Epsilon等对JVM和平台的改进持续进行,以满足应用的高性能、低延迟等需求。
- 工具层面:JShell、JDK Flight Recorder、JDK Mission Control等有力的工具不断发展,帮助开发者更高效地工作。
综上,Java作为一门语言,正在朝着更简洁、更方便、性能更强以及生态更丰富的方向不断演进。这也使得Java成为当下最流行的编程语言之一,在各个领域得到广泛的使用。我相信,如果 Oracle继续保持这样渐进的变化方式,同时也不断听取来自社区的反馈,Java语言以及生态系统会持续保持旺盛的生命力,服务广大的开发者。毕竟,语言和平台只有不断调整才能真正地与时俱进。