Java 18的新特性

发布时间:2023-11-23 10:02
最后更新:2023-11-23 15:43
所属分类:
JVM Java

Java 18是继Java 17这个长期支持版之后的第一个小进化版本。Java 18中引入的变化并不多,根据OpenJDK官方网站的介绍,约引入了9个新特性。

但是不是所有的新特性都会对编码产生很大的影响。

本系列的文章有:

  1. Java 8的新特性
  2. Java 9的新特性
  3. Java 10的新特性
  4. Java 11的新特性
  5. Java 12的新特性
  6. Java 13的新特性
  7. Java 14的新特性
  8. Java 15的新特性
  9. Java 16的新特性
  10. Java 17的新特性
  11. Java 18的新特性

设定以UTF-8为默认的字符集

在Java 18之前的Java版本中,包括Java 17在内,Java程序的缺省字符集是在Java运行启动的时候确定的。这个缺省字符集随系统不同而不同,例如在macOS上就是UTF-8,在Windows上就是基于代码页的字符集。这样就会产生一个问题,在程序跨平台使用时,如果打开同样的一个文件,就可能会出现读出的文件内容因系统语言环境不同,而不同,这个现象俗称“乱码”。

从Java 18开始,所有Java标准API都将使用UTF-8编码进行标准化。但要注意的是,控制台IO的编码并没有标准化。

引入了一个简易的Web服务器

Java 18提供了一个二进制的简易Web服务器工具,这个工具可以提供原型设计、临时编码和测试等功能目的使用。这简易的Web服务器只是提供了负载静态文件的基础HTTP服务能力。这个Web服务器工具可以通过控制台或者代码启动,但是使用的时候需要注意,这个服务器并不是提供给生产使用的。

要从控制台启动这个简单的Web服务器可以执行以下命令:

1
jwebserver -p 9000

此时,Web服务器就被启动,并监听 9000 端口了,这个服务启动的时候会列出其负载的文件所在的目录。

如果需要使用代码启动服务器,可以使用以下代码:

1
2
var server = SimpleFileServer.createFileServer(new InetSocketAddress(9000), Path.of("/tmp"), OutputLevel.VERBOSE);
server.start();

允许在JavaDoc中使用代码片段

在Java 18之前,如果需要在JavaDoc里插入代码片段需要使用<pre>{@code }</pre>标签,而且在这个标签之中不能出现其他任何HTML标签。在Java 18里新引入了@snippet标签,所以现在就可以在JavaDoc里插入比较复杂的代码片段了,或者是直接引用某个代码文件的指定部分。

例如JEP中提到的使用示例:

1
2
3
4
5
6
7
8
/**
 * 以下是一个对于方法 {@code Something.isNotNone} 的使用示例
 * {@snippet
 * if (v.isNotNone()) {
 *   System.out.println("v: " + v.get());
 * }
 * }
 * /

或者还可以使用引用语法来直接从其他的代码文件中直接引用其中定义好的区块。例如有这样的一个名称为 SomethingSpecial.java 的文件。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
// SomethingSpecial.java
public class SomethingSpecial {
  void show(Something v) {
    // @start region="example"
    if (v.isNotNone()) {
      System.out.println("v: " + v.get());
    }
    // @end
  }
}

那么就可以在JavaDoc中使用以下方式来将其中使用 // @start region=""// @end 定义的区块引入进来。

1
2
3
/**
 * {@snippet file="SomethingSpecial.java" region="example"}
 * /

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

核心反射内部使用了两种机制来调用构造方法和函数,在多次反射调用以后,这个反射操作会被生成字节码用于获得更好的性能。在Java 18中完成的核心反射的重新实现,只是为了未来支持Project Valhalla,对于反射功能的实际使用没有发生任何改变。

互联网地址解析接口

在Java 18之前的Java版本中,对于网络主机名的解析是由系统来完成的,这种解析方式通常会造成程序的阻塞。Java 18中的这项改动也是为了Project Loom准备的。

继续孵化功能

  • 向量计算(Vector API)功能。向量计算功能在Java 18中开启了第三轮的孵化,目标是让向量计算能够达到与标量计算等效的性能。
  • 外部函数与内存API,这个特性在Java 18中开启了第二轮的孵化。

预览功能

  • 对Java 17中引入的switch模式匹配特性开启了第二轮的预览。

弃用功能

  • finalize方法已经标记为废弃,并将在未来版本中移除。

索引标签
JVM
Java
Java 18
新特性