Java18新特性(2022年3月)

正式特性

默认使用UTF-8字符编码

从jdk18开始,默认使用UTF-8字符编码。

我们可以通过如下参数修改其他字符编码:

字符集统一的好处

简单的web服务器

可以通过jwebserver命令启动jdk18中提供的静态web服务器,可以利用该工具查看一些原型,做简单的测试。在命令提示符中输入jwebserver命令后会启动,然后在浏览器中输入:http://127.0.0.1:8000/ 即可看到当前命令提示符路径下的文件了。

实际使用场景:

这个工具主要用于

  • 快速原型开发:不需要配置复杂的服务器.

  • 文件分享:在局域网内快速分享文件

  • 静态网站测试:测试前端项目

  • 教学演示:简单的 HTTP 服务器示例

@snippet注解

Java 18 引入了 @snippet 标签,可以让 JavaDoc 生成的代码示例更美观,而且支持从外部文件引入代码片段。

@snippet 的高级功能

外部文件示例((examples/DatabaseExample.java)

用方法句柄重新实现核心反射

Java 18 在内部使用方法句柄重新实现了核心反射功能,这个改进对开发者是透明的,但可以提供:

  • 更好的性能:方法句柄比传统反射更快

  • 更少的内存占用:减少了元数据开销.

  • 更好的 JIT 优化:编译器可以更好地优化

互联网地址解析 SPI

Java 18 引入了互联网地址解析的服务提供者接口(SPI),允许自定义 DNS 解析:

这个特性主要用于

  • 企业内部 DNS:解析内部域名

  • 负载均衡:自定义负载均衡策略

  • 缓存优化:实现 DNS 缓存策略

  • 测试环境:模拟不同的网络环境

将被移除的方法

在jdk18中标记了Object中的finalize方法,Thread中的stop方法将在未来被移除。

JIT 编译器优化

Java 18 包含了多项 川T 编译器优化

  • 更好的循环优化:改进了循环展开和向量化

  • 方法内联优化:更智能的内联决策

  • 逃逸分析改进:减少不必要的堆分配

垃圾收集器改进

G1 垃圾收集器优化

ZGC 和 Shenandoah 优化

预览特性

switch 的模式匹配(第二次预览)

Java 18 继续完善 switch 的模式匹配

与 Records 和 Sealed 类结合

孵化器特性

向量 API(第三次孵化器)

Java 18 继续改进向量 API

外部函数和内存 API(第二次孵化器)

Java 18 继续完善外部函数和内存 API

Java19新特性(2022年9月)

正式特性

Linux/RISC-V 端口

Java 19 正式支持 RISC-V 架构的 Linux 系统

RISC-V 的特点

  • 开源免费:不需要授权费用

  • 可扩展性:支持自定义指令

  • 生态发展:越来越多厂商支持

Thread.builder接口

在jdk19中新增了一个密封(sealed)接口Builder,该接口只允许有两个子接口实现:

  • OfPlatform:创建平台线程的时候使用,是一个密封接口,只允许ThreadBuilders.PlatformThreadBuilder实现。

  • OfVirtual:创建虚拟线程的时候使用,是一个密封接口,只允许ThreadBuilders.VirtualThreadBuilder实现。

上面3种创建虚拟线程的方式本质都是通过OfVirtual来进行创建的,OfVirtual和OfPlatform接口中的api很多是相同的,OfPlatform中的方法更多,所以下面我们以OfPlatform为例演示他的使用方式。

通过OfPlatform中的factory()方法可以创建一个ThreadFactory线程工厂,学过线程池的同学对它应该并不陌生,它可以帮助我们创建出平台线程对象。

除了上面的用法之外,还可以用它来创建平台线程对象

上面创建平台线程的方式跟之前的new Thread是一样的,优点是我们可以用它来实现链式编程,比如要设置线程优先级,线程名字,守护线程:

java.io包下类的变化

为了减少内存的使用,BufferedOutputStream,BufferedWriter,OutputStreamWriter中默认的初始数组大小由之前的8192变成了512。

预览特性

虚拟线程(预览)

Java 19 引入了虚拟线程作为预览特性,这是 Project Loom 的核心成果:

  • 虚拟线程中的ThreadLocal

由于虚拟线程的数量会比较多,所以在使用ThreadLocal的时候一定要注意。线程池中的线程在执行多个任务的时候,不要使用ThreadLocal。在Thread.Builder中提供了不支持ThreadLocal的方法。

  • LockSupport对虚拟线程的支持

LockSupport是支持虚拟线程的,当调用park()方法时,虚拟线程会解除挂载,这样平台线程可以执行其他的操作,当调用unpark()方法时,虚拟线程会被调度器重新挂载到平台线程,再继续工作。

详情可以看这篇文章:虚拟线程

Record 模式(预览)

Java 19 引入了 Record 模式匹配

switch 的模式匹配(第三次预览)

Java 19 继续完善 switch 模式匹配

外部函数和内存 API(预览)

Java 19 将外部函数和内存 API升级为预览特性

孵化器特性

向量 API(第四次孵化器)

Java 19 继续改进向量 API

结构化并发(孵化器)

Java 19 引入了结构化并发 API

Java20新特性(2023年3月)

Java 20 主要是继续完善预览特性,没有引入新的正式特性。

预览特性

Record 模式(第二次预览)

Java 20 继续完善 Record 模式

switch 的模式匹配(第四次预览)

Java 20 进一步改进了 switch 模式匹配

外部函数和内存 API(第二次预览)

Java 20 继续完善外部函数和内存 API

虚拟线程(第二次预览)

Java 20 改进了虚拟线程

孵化器特性

作用域值(孵化器)

Java 20 引入了作用域值 API

作用域值的优势

  • 不可变性:一旦绑定就不能修改

  • 自动传递:在调用链中自动传递

  • 性能优化:比ThreadLocal 更高效

  • 结构化:有明确的作用域边界

结构化并发(第二次孵化器)

Java 20 改进了结构化并发