JDK各个版本特性讲解-JDK18特性

2023-12-20 18:44
文章标签 讲解 jdk 特性 版本 jdk18

本文主要是介绍JDK各个版本特性讲解-JDK18特性,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

JDK各个版本特性讲解-JDK18特性

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

一、JAVA18概述

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

https://openjdk.org/projects/jdk/18/

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

然后启动 jwebserver:

image.png

启动成功:http://127.0.0.1:8000

image.png

cmd窗口出现乱码的情况。因为JAVA18默认编码为 UTF-8,但是在cmd中的默认编码为GBK。这时我们需要调整下。在cmd窗口输入 chcp

image.png

655001:代表UTF-8编码,
936 : 代表GBK编码。

我们临时修改就可以了。输入chcp 65001可以将当前窗口的编码形式修改为UTF-8

image.png

image.png

服务启动访问的是当前bin目录。我们可以在自己的项目中创建对应的index.html文件

image.png

然后我们可以看看帮助命令。怎么指定到特定的目录:

image.png

jwebserver -d E:\workspace\VipWorkSpace\JDKDemo03\src

image.png

image.png

有请求的时候控制台会有相关的输出信息

image.png

3.JavaDoc的增强

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

/*** JavaDoc特性讲解*  {@snippet :*      if(v.isPresent()){*          System.out.println("Hello ... ")*      }*  }*/
public class Test01 {/*** 正则高亮:* {@snippet :*   public static void main(String... args) {*       for (var arg : args) {                 // @highlight region regex = "\barg\b"*           if (!arg.isBlank()) {*               System.out.println(arg);*           }*       }                                      // @end*      }*   }*/public static void main(String[] args) {System.out.println(Charset.defaultCharset());System.out.println("波哥....");}/*** 两数求和:* {@snippet :*   public Integer add(int a,int b){*      System.out.println("add ..."); // @replace regex='".*"' replacement="..."*      return a + b;*   }* }*/public Integer add(int a,int b){System.out.println("add ...");return a + b ;}
}

生成doc文档

D:\software\openjdk-19.0.1_windows-x64_bin\jdk-19.0.1\bin\javadoc.exe -public -sourcepath ./src -subpackages com -encoding utf-8 -charset utf-8 -d ./javadocout

image.png

然后结合 jwebserver来查看发布的doc文档

image.png

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可以使用平台内置解析器以外的解析器。

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

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 表达式进行了增强,使之可以减少代码量。

注意这块的代码需要通过2022版的IDEA才支持。

image.png

下面是几个例子:

// JDK 17 以前
static String formatter(Object o) {String formatted = "unknown";if (o instanceof Integer i) {formatted = String.format("int %d", i);} else if (o instanceof Long l) {formatted = String.format("long %d", l);} else if (o instanceof Double d) {formatted = String.format("double %f", d);} else if (o instanceof String s) {formatted = String.format("String %s", s);}return formatted;
}

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

// JDK 17 之后
static String formatterPatternSwitch(Object o) {return switch (o) {case Integer i -> String.format("int %d", i);case Long l    -> String.format("long %d", l);case Double d  -> String.format("double %f", d);case String s  -> String.format("String %s", s);default        -> o.toString();};
}

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

static void testFooBar(String s) {switch (s) {case null         -> System.out.println("Oops");case "Foo", "Bar" -> System.out.println("Great");default           -> System.out.println("Ok");}
}

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

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

case 时可以进行类型判断

sealed interface S permits A, B, C {}
final class A implements S {}
final class B implements S {}
record C(int i) implements S {}  // Implicitly finalstatic int testSealedExhaustive(S s) {return switch (s) {case A a -> 1;case B b -> 2;case C c -> 3;};
}

这篇关于JDK各个版本特性讲解-JDK18特性的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/517087

相关文章

从入门到精通C++11 <chrono> 库特性

《从入门到精通C++11<chrono>库特性》chrono库是C++11中一个非常强大和实用的库,它为时间处理提供了丰富的功能和类型安全的接口,通过本文的介绍,我们了解了chrono库的基本概念... 目录一、引言1.1 为什么需要<chrono>库1.2<chrono>库的基本概念二、时间段(Durat

嵌入式数据库SQLite 3配置使用讲解

《嵌入式数据库SQLite3配置使用讲解》本文强调嵌入式项目中SQLite3数据库的重要性,因其零配置、轻量级、跨平台及事务处理特性,可保障数据溯源与责任明确,详细讲解安装配置、基础语法及SQLit... 目录0、惨痛教训1、SQLite3环境配置(1)、下载安装SQLite库(2)、解压下载的文件(3)、

Mac系统下卸载JAVA和JDK的步骤

《Mac系统下卸载JAVA和JDK的步骤》JDK是Java语言的软件开发工具包,它提供了开发和运行Java应用程序所需的工具、库和资源,:本文主要介绍Mac系统下卸载JAVA和JDK的相关资料,需... 目录1. 卸载系统自带的 Java 版本检查当前 Java 版本通过命令卸载系统 Java2. 卸载自定

使用jenv工具管理多个JDK版本的方法步骤

《使用jenv工具管理多个JDK版本的方法步骤》jenv是一个开源的Java环境管理工具,旨在帮助开发者在同一台机器上轻松管理和切换多个Java版本,:本文主要介绍使用jenv工具管理多个JD... 目录一、jenv到底是干啥的?二、jenv的核心功能(一)管理多个Java版本(二)支持插件扩展(三)环境隔

MySQL版本问题导致项目无法启动问题的解决方案

《MySQL版本问题导致项目无法启动问题的解决方案》本文记录了一次因MySQL版本不一致导致项目启动失败的经历,详细解析了连接错误的原因,并提供了两种解决方案:调整连接字符串禁用SSL或统一MySQL... 目录本地项目启动报错报错原因:解决方案第一个:第二种:容器启动mysql的坑两种修改时区的方法:本地

Java进程CPU使用率过高排查步骤详细讲解

《Java进程CPU使用率过高排查步骤详细讲解》:本文主要介绍Java进程CPU使用率过高排查的相关资料,针对Java进程CPU使用率高的问题,我们可以遵循以下步骤进行排查和优化,文中通过代码介绍... 目录前言一、初步定位问题1.1 确认进程状态1.2 确定Java进程ID1.3 快速生成线程堆栈二、分析

conda安装GPU版pytorch默认却是cpu版本

《conda安装GPU版pytorch默认却是cpu版本》本文主要介绍了遇到Conda安装PyTorchGPU版本却默认安装CPU的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目录一、问题描述二、网上解决方案罗列【此节为反面方案罗列!!!】三、发现的根本原因[独家]3.1 p

Redis指南及6.2.x版本安装过程

《Redis指南及6.2.x版本安装过程》Redis是完全开源免费的,遵守BSD协议,是一个高性能(NOSQL)的key-value数据库,Redis是一个开源的使用ANSIC语言编写、支持网络、... 目录概述Redis特点Redis应用场景缓存缓存分布式会话分布式锁社交网络最新列表Redis各版本介绍旧

IIS 7.0 及更高版本中的 FTP 状态代码

《IIS7.0及更高版本中的FTP状态代码》本文介绍IIS7.0中的FTP状态代码,方便大家在使用iis中发现ftp的问题... 简介尝试使用 FTP 访问运行 Internet Information Services (IIS) 7.0 或更高版本的服务器上的内容时,IIS 将返回指示响应状态的数字代

javascript fetch 用法讲解

《javascriptfetch用法讲解》fetch是一个现代化的JavaScriptAPI,用于发送网络请求并获取资源,它是浏览器提供的全局方法,可以替代传统的XMLHttpRequest,这篇... 目录1. 基本语法1.1 语法1.2 示例:简单 GET 请求2. Response 对象3. 配置请求