JDK18特性

太过爱你忘了你带给我的痛 2023-10-16 09:01 191阅读 0赞

文章目录

  • JAVA18概述
    1. 默认UTF-8字符编码
    1. 简单的Web服务器
  • 3.JavaDoc的增强
    1. 反射功能的新特性
  • 5.Vector API(三次孵化)
    1. 互联网地址解析SPI
    1. 外部函数和内存API(二次孵化)
  • 8.switch 表达式

在这里插入图片描述

JAVA18概述

Java 18 在 2022 年 3 月 22 日正式发布,Java 18 不是一个长期支持版本,这次更新共带来 9 个新功能。

官方地址

image.png

1. 默认UTF-8字符编码

JDK 一直都是支持 UTF-8 字符编码,这次是把 UTF-8 设置为了默认编码,也就是在不加任何指定的情况下,默认所有需要用到编码的 JDK API 都使用 UTF-8 编码,这样就可以避免因为不同系统,不同地区,不同环境之间产生的编码问题。

2. 简单的Web服务器

在JDK18中提供一个简单的Web服务。也就是在bin目录下提供了一个 jwebserver的命令。运行这个命令可以启动一个 简单的、最小的静态web服务器。它不支持 CGI 和 Servlet,所以最好的使用场景是用来测试、教育、演示等需求。

image.png

3.JavaDoc的增强

在Java18中新增了对JavaDoc的增强,在之前的版本虽然已经提供了在JavaDoc中添加代码片段,但是对高亮处理没有提供支持。在Java18中提供了功能

  1. /**
  2. * JavaDoc特性讲解
  3. * {@snippet :
  4. * if(v.isPresent()){
  5. * System.out.println("Hello ... ")
  6. * }
  7. * }
  8. */
  9. public class Test01 {
  10. /**
  11. * 正则高亮:
  12. * {@snippet :
  13. * public static void main(String... args) {
  14. * for (var arg : args) { // @highlight region regex = "\barg\b"
  15. * if (!arg.isBlank()) {
  16. * System.out.println(arg);
  17. * }
  18. * } // @end
  19. * }
  20. * }
  21. */
  22. public static void main(String[] args) {
  23. System.out.println(Charset.defaultCharset());
  24. System.out.println("波哥....");
  25. }
  26. /**
  27. * 两数求和:
  28. * {@snippet :
  29. * public Integer add(int a,int b){
  30. * System.out.println("add ..."); // @replace regex='".*"' replacement="..."
  31. * return a + b;
  32. * }
  33. * }
  34. */
  35. public Integer add(int a,int b){
  36. System.out.println("add ...");
  37. return a + b ;
  38. }
  39. }

image.png

image.png

4. 反射功能的新特性

Java 18 改进了 java.lang.reflect.Method、Constructor 的实现逻辑,使之性能更好,速度更快。这项改动不会改动相关 API ,这意味着开发中不需要改动反射相关代码,就可以体验到性能更好反射。

OpenJDK 官方给出了新老实现的反射性能基准测试结果。

image.png

5.Vector API(三次孵化)

在 Java 16 中引入一个新的 API 来进行向量计算,它可以在运行时可靠的编译为支持的 CPU 架构,从而实现更优的计算能力。在 Java 17 中改进了 Vector API 性能,增强了例如对字符的操作、字节向量与布尔数组之间的相互转换等功能。现在在 JDK 18 中将继续优化其性能。

6. 互联网地址解析SPI

为主机名和地址解析定义服务提供者接口 (SPI),以便 java.net.InetAddress可以使用平台内置解析器以外的解析器。

  1. public static void main(String[] args) throws Exception {
  2. InetAddress inetAddress = InetAddress.getByName("cart.msb.com");
  3. System.out.println(inetAddress.getHostAddress());
  4. }

7. 外部函数和内存API(二次孵化)

新的 API 允许 Java 开发者与 JVM 之外的代码和数据进行交互,通过调用外部函数,可以在不使用 JNI 的情况下调用本地库。

这是一个孵化功能;需要添加 --add-modules jdk.incubator.foreign 来编译和运行 Java 代码,Java 18 改进了相关 API ,使之更加简单易用。

8.switch 表达式

从 Java 17 开始,对于 Switch 的改进就已经在进行了,Java 17 的 JEP 406 已经对 Switch 表达式进行了增强,使之可以减少代码量。

下面是几个例子:

  1. // JDK 17 以前
  2. static String formatter(Object o) {
  3. String formatted = "unknown";
  4. if (o instanceof Integer i) {
  5. formatted = String.format("int %d", i);
  6. } else if (o instanceof Long l) {
  7. formatted = String.format("long %d", l);
  8. } else if (o instanceof Double d) {
  9. formatted = String.format("double %f", d);
  10. } else if (o instanceof String s) {
  11. formatted = String.format("String %s", s);
  12. }
  13. return formatted;
  14. }

而在 Java 17 之后,可以通过下面的写法进行改进

  1. // JDK 17 之后
  2. static String formatterPatternSwitch(Object o) {
  3. return switch (o) {
  4. case Integer i -> String.format("int %d", i);
  5. case Long l -> String.format("long %d", l);
  6. case Double d -> String.format("double %f", d);
  7. case String s -> String.format("String %s", s);
  8. default -> o.toString();
  9. };
  10. }

switch 可以和 null 进行结合判断:

  1. static void testFooBar(String s) {
  2. switch (s) {
  3. case null -> System.out.println("Oops");
  4. case "Foo", "Bar" -> System.out.println("Great");
  5. default -> System.out.println("Ok");
  6. }
  7. }

case 时可以加入复杂表达式:

  1. static void testTriangle(Shape s) {
  2. switch (s) {
  3. case Triangle t && (t.calculateArea() > 100) ->
  4. System.out.println("Large triangle");
  5. default ->
  6. System.out.println("A shape, possibly a small triangle");
  7. }
  8. }

case 时可以进行类型判断

  1. sealed interface S permits A, B, C {
  2. }
  3. final class A implements S {
  4. }
  5. final class B implements S {
  6. }
  7. record C(int i) implements S {
  8. } // Implicitly final
  9. static int testSealedExhaustive(S s) {
  10. return switch (s) {
  11. case A a -> 1;
  12. case B b -> 2;
  13. case C c -> 3;
  14. };
  15. }

发表评论

表情:
评论列表 (有 0 条评论,191人围观)

还没有评论,来说两句吧...

相关阅读