Java 18 于 2022 年 3 月发布,为开发者带来了许多新功能和改进。相比 Java 8,Java 18 在多个方面都进行了优化和增强。这篇博客将深入探讨 Java 18 的主要新特性,并与 Java 8 进行对比,帮助开发者更好地理解和利用这些更新。
1. 简化的字符集
Java 8
在 Java 8 中,默认字符集是 ISO-8859-1
。处理多语言文本时,开发者通常需要显式指定 UTF-8
字符集。
Java 18
Java 18 中,默认字符集从 ISO-8859-1
更改为 UTF-8
。这一更改简化了字符处理,尤其是在处理多语言文本时,减少了代码的复杂性和潜在的错误。
示例代码对比
// Java 8 中 String text = "你好,世界!"; byte[] bytes = text.getBytes(StandardCharsets.UTF_8); String decoded = new String(bytes, StandardCharsets.UTF_8); System.out.println(decoded); // 输出:你好,世界! // Java 18 中 String text = "你好,世界!"; byte[] bytes = text.getBytes(); String decoded = new String(bytes); System.out.println(decoded); // 输出:你好,世界!
2. 新的 SimpleWebServer
Java 8
Java 8 中没有内置的简单 Web 服务器。开发者通常需要依赖第三方库或框架(如 Jetty、Tomcat)来进行本地开发和测试。
Java 18
Java 18 引入了一个简单的 Web 服务器 SimpleWebServer
,非常适合用于本地开发和测试。它可以快速启动,不需要复杂的配置。
启动示例对比
# Java 18 中,在命令行中启动简单的 Web 服务器 java -m jdk.httpserver
或使用以下代码在 Java 应用程序中启动服务器:
import com.sun.net.httpserver.SimpleFileServer; import com.sun.net.httpserver.SimpleFileServer.OutputLevel; import java.net.InetSocketAddress; // Java 18 中 public class SimpleWebServerExample { public static void main(String[] args) { var server = SimpleFileServer.createFileServer(new InetSocketAddress(8000), java.nio.file.Path.of("."), OutputLevel.VERBOSE); server.start(); System.out.println("Server started at http://localhost:8000"); } }
3. 代码段 API(JEP 413)
Java 8
Java 8 中没有专门的 API 用于从源文件中提取代码段并包含在生成的文档中。开发者通常需要手动复制代码或使用外部工具。
Java 18
Java 18 提供了新的代码段 API(Code Snippets API),用于文档生成工具,可以从 Java 源文件中提取代码段并包含在生成的文档中。
示例代码段
/** * This is a sample class. * {@snippet : * public class HelloWorld { * public static void main(String[] args) { * System.out.println("Hello, World!"); * } * }} */ public class HelloWorldSnippet { // class implementation }
4. 向量 API(第三孵化版)
Java 8
Java 8 没有向量 API。开发者需要使用第三方库(如 Apache Commons Math)来实现矢量计算。
Java 18
向量 API(Vector API)提供了一种处理矢量计算的高效方式,特别适用于数据并行操作。虽然目前仍在孵化阶段,但它展示了 Java 对高性能计算领域的支持。
示例代码
import jdk.incubator.vector.FloatVector; import jdk.incubator.vector.VectorSpecies; // Java 18 中 public class VectorExample { private static final VectorSpecies<Float> SPECIES = FloatVector.SPECIES_256; public static void main(String[] args) { float[] a = {1.0f, 2.0f, 3.0f, 4.0f}; float[] b = {1.0f, 2.0f, 3.0f, 4.0f}; FloatVector va = FloatVector.fromArray(SPECIES, a, 0); FloatVector vb = FloatVector.fromArray(SPECIES, b, 0); FloatVector vc = va.add(vb); vc.intoArray(a, 0); for (float f : a) { System.out.println(f); // 输出 2.0, 4.0, 6.0, 8.0 } } }
5. 增强的 Pattern Matching
(模式匹配)
Java 8
Java 8 中,模式匹配功能非常有限。开发者需要使用 instanceof
和类型转换来处理不同类型的数据。
Java 18
Java 18 继续改进模式匹配功能,使得处理复杂的数据结构更加简便。这些增强的模式匹配功能使代码更加简洁和可读。
示例代码对比
// Java 8 中 public class PatternMatchingExampleJava8 { static void printObject(Object obj) { if (obj instanceof String) { String s = (String) obj; System.out.println("String: " + s); } else if (obj instanceof Integer) { Integer i = (Integer) obj; System.out.println("Integer: " + i); } else { System.out.println("Unknown object"); } } public static void main(String[] args) { printObject("Hello, World!"); // 输出:String: Hello, World! printObject(123); // 输出:Integer: 123 } } // Java 18 中 public class PatternMatchingExample { static void printObject(Object obj) { if (obj instanceof String s) { System.out.println("String: " + s); } else if (obj instanceof Integer i) { System.out.println("Integer: " + i); } else { System.out.println("Unknown object"); } } public static void main(String[] args) { printObject("Hello, World!"); // 输出:String: Hello, World! printObject(123); // 输出:Integer: 123 } }