Java18新增特性
前言
前面的文章,我们对Java9、Java10、Java11、Java12 、Java13、Java14、Java15、Java16、Java17 的特性进行了介绍,对应的文章如下
Java9新增特性
Java10新增特性
Java11新增特性
Java12新增特性
Java13新增特性
Java14新增特性
Java15新增特性
Java16新增特性
Java17新增特性
今天我们来一起看一下Java18这个版本的一些重要信息
版本介绍
Java 18 是Java的一个新版本,于2022年3月22日正式发布。这个版本带来了许多新功能,其中最重要的是默认UTF-8字符编码。在此版本之前,UTF-8编码需要显式指定,但现在,在不加任何指定的情况下,所有需要用到编码的JDK API都默认使用UTF-8编码。这样可以避免在不同系统、不同地区、不同环境之间因编码问题产生的困扰。
其他的新功能包括JEP 400,这是一个默认UTF-8字符编码的更新,它将UTF-8设置为默认编码。这个改变意味着在不加任何指定的情况下,所有需要用到编码的JDK API都默认使用UTF-8编码。
此外,Java 18还提供了一些其他的更新和改进,包括对现有特性的改进和新的APIs。这些新功能和改进可以帮助开发者更高效地进行开发,提高代码的质量和可维护性。
总的来说,Java 18是一个功能丰富、易于使用和高效的版本。虽然它可能不是长期支持版本,但它仍然是一个值得关注的版本,特别是对于那些需要处理大量文本或需要跨多个平台开发的开发者来说。
特性列表
-
默认UTF-8字符编码 :Java 18将UTF-8设置为默认编码,这使得所有需要用到编码的JDK API都默认使用UTF-8编码,从而避免了在不同系统、不同地区、不同环境之间因编码问题产生的困扰。
-
性能提升 :Java 18对性能进行了优化和提升,包括对代码的执行速度、内存使用和垃圾回收等方面的改进。
-
安全性增强 :Java 18加强了安全性特性,包括对代码的安全性检查和加密算法的改进。
-
更好的开发体验 :Java 18对开发工具和环境进行了改进,提供了更好的开发体验和易用性。例如,它对调试、代码分析和重构等方面进行了优化。
-
更广泛的平台支持 :Java 18支持更多的操作系统和平台,包括Windows、Linux、macOS等。这使得开发者可以更方便地在不同的环境中开发和部署Java应用程序。
-
改进的日志记录API :Java 18对日志记录API进行了改进,增加了新的日志级别,并提供了更强大的日志管理功能。
-
支持Unicode 10 :Java 18支持Unicode 10标准,这使得开发者可以更加方便地处理和显示Unicode字符。
-
改进的启动性能 :Java 18对启动性能进行了优化,使得Java应用程序的启动速度更快。
-
支持新的HTTP/2特性 :Java 18支持新的HTTP/2协议特性,包括多路复用、头压缩和服务器推送等功能,这使得Java应用程序能够更好地利用网络资源。
-
改进的NIO.2 API :Java 18对NIO.2 API进行了改进,增加了新的通道类型和缓冲区类型,并优化了通道的关闭机制,这使得开发者能够更加高效地处理和操作文件和网络资源。
-
支持IPv6 :Java 18默认支持IPv6,这使得开发者能够更加方便地在网络中使用IPv6地址。
-
改进的并发性能 :Java 18对并发性能进行了优化和改进,包括对线程池、任务调度、锁等功能的改进,这使得Java应用程序能够更好地处理并发操作。
-
改进的JVM诊断工具 :Java 18改进了JVM诊断工具,包括jmap、jstack等命令行工具和JVisualVM等图形化工具,这使得开发者能够更加方便地诊断和解决JVM相关的问题。
-
改进的日期和时间API :Java 18对日期和时间API进行了改进,增加了新的日期和时间类,并优化了现有的日期和时间类,这使得开发者能够更加方便地处理日期和时间相关的操作。
-
支持Java平台模块系统(JPMS) :Java 18支持Java平台模块系统(JPMS),这使得开发者能够更加方便地构建和管理大型应用程序。
-
改进的编译器 :Java 18对编译器进行了改进,增加了新的编译选项和优化编译器输出,这使得开发者能够更加方便地优化编译器的输出。
-
改进的JMX(Java Management Extensions) :Java 18对JMX进行了改进,增加了新的MBean类和操作,并优化了现有的JMX API,这使得开发者能够更加方便地管理和监控Java应用程序。
-
支持无限精度算术(Quadruple Precision Arithmetic) :Java 18支持无限精度算术,这使得开发者能够更加精确地进行数值计算。
-
改进的XML处理API :Java 18对XML处理API进行了改进,增加了新的XML解析器和生成器,并优化了现有的XML处理API,这使得开发者能够更加方便地处理XML相关的操作。
代码示例
- 默认UTF-8字符编码:
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.charset.StandardCharsets;
public class DefaultUTF8EncodingExample {public static void main(String[] args) {try {String content = new String(Files.readAllBytes(Paths.get("example.txt")));System.out.println(content);} catch (IOException e) {e.printStackTrace();}}
}
- 使用方法句柄重新实现反射核心功能:
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.reflect.Method;
public class MethodHandleExample {public static void main(String[] args) throws Throwable {Method method = String.class.getMethod("length");MethodHandle methodHandle = MethodHandles.lookup().findVirtual(String.class, "length", method.getReturnType());int length = (int) methodHandle.invoke("Hello, World!");System.out.println(length);}
}
- 使用Vector API(三次孵化):
import java.util.Vector;
public class VectorExample {public static void main(String[] args) {Vector<String> vector = new Vector<>();vector.add("Hello");vector.add("World");System.out.println(vector);}
}
- 使用互联网地址解析SPI:
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ServiceLoader;
public class InternetAddressResolutionSPIExample {public static void main(String[] args) {try {InetAddress address = InetAddress.getByName("www.example.com");System.out.println(address);} catch (UnknownHostException e) {e.printStackTrace();}}
}
- 使用Foreign Function & Memory API (第二次孵化):
import jnr.ffi.Pointer;
import jnr.ffi.Runtime;
import jnr.ffi.types.size_t;
public class ForeignFunctionAndMemoryAPIExample {public static void main(String[] args) {Runtime runtime = Runtime.getRuntime();Pointer pointer = runtime.malloc(runtime.sizeOf(Integer.class));int value = 42;runtime.writeInt(pointer, 0, value);int readValue = runtime.readInt(pointer, 0);System.out.println(readValue);runtime.free(Pointer.to(pointer));}
}
- 使用switch表达式(二次孵化):
public class SwitchExpressionExample {public static void main(String[] args) {int number = 2;String result = switch (number) {case 1 -> "One";case 2 -> "Two";default -> "Other";};System.out.println(result);}
}
- 使用Sealed Classes(二次孵化):
public sealed class Animal {static class Dog extends Animal {@Overridepublic void makeSound() {System.out.println("Woof!");}}static class Cat extends Animal {@Overridepublic void makeSound() {System.out.println("Meow!");}}public abstract void makeSound();
}
- 使用Pattern Matching for instanceof(二次孵化):
public class PatternMatchingForInstanceofExample {public static void main(String[] args) {Object obj1 = new Integer(42);Object obj2 = new Double(3.14);if (obj1 instanceof Integer) {System.out.println("obj1 is an Integer");} else if (obj1 instanceof Double) {System.out.println("obj1 is a Double");} else {System.out.println("obj1 is neither an Integer nor a Double");}if (obj2 instanceof Integer) {System.out.println("obj2 is an Integer");} else if (obj2 instanceof Double) {System.out.println("obj2 is a Double");} else {System.out.println("obj2 is neither an Integer nor a Double");}}
}
总结
需要注意的是,Java 18可能不是长期支持版本,但它仍然是一个值得关注的版本,特别是对于那些需要处理大量文本或需要跨多个平台开发的开发者来说。
拓展
SPI
SPI是Service Provider Interface的缩写,中文意思是服务提供者接口。SPI是一种服务发现机制,它允许第三方为应用程序提供插件式的扩展。
它定义了一个标准的接口,使得应用程序可以与提供的服务进行交互。SPI的实现通常包括以下组件:
- Service Provider:服务提供者是一个实现了SPI接口的第三方应用程序。它提供了一些特定的服务,例如数据存储、消息传递、日志记录等。
- Service Consumer:服务消费者是一个需要使用服务提供者所提供的服务的程序。它通过SPI接口与服务提供者进行交互。
- SPI配置文件:SPI配置文件是一个标准的配置文件,用于描述服务提供者及其提供的服务。它包含了服务提供者的名称、版本号、依赖关系等信息。
- 使用SPI机制,应用程序可以在运行时动态地发现和加载服务提供者,并使用它们提供的服务。这种机制使得第三方可以方便地为应用程序添加扩展功能,而不需要修改应用程序本身的代码。同时,由于SPI接口是标准化的,因此不同的服务提供者可以实现相互兼容,使得应用程序可以灵活地选择不同的服务提供者。
总之,SPI是一种非常灵活和可扩展的服务发现机制,它使得应用程序可以动态地加载和使用第三方提供的扩展功能。
相关文章:

Java18新增特性
前言 前面的文章,我们对Java9、Java10、Java11、Java12 、Java13、Java14、Java15、Java16、Java17 的特性进行了介绍,对应的文章如下 Java9新增特性 Java10新增特性 Java11新增特性 Java12新增特性 Java13新增特性 Java14新增特性 Java15新增特性 Java…...

springboot容器
1.主要指的是servlet容器 servlet组件由sevlet Filter Listener等 2.自动配置原理 通过ServletWebServerFactoryAutoConfiguration 配置这些内容 (自动配置类开始分析功能) conditionalOnclass开启条件 ServletRequest类 import导入嵌入式的tomcat Jetty等 这些是配置类&…...

Windows 10 下使用Visual Studio 2017 编译CEF SDK
1.下载CEF SDK 由于需要跑在32位的机器,所以选择下载32位的SDKCEF Automated Builds 选择 Current Stable Build (Preferred) ,这是当前稳定版本,CEF版本118 下载成功解压 2.下载编译工具 CMake 下载地址:CMake 配置CMake指向…...

数字货币swap交易所逻辑系统开发分析方案
随着数字货币市场的快速发展, Swap交易所已成为一种重要的交易方式。本文将对数字货币Swap交易所逻辑系统开发进行分析,并探讨其优势、开发难点和解决方案。 一、数字货币Swap交易所逻辑系统开发的优势 数字货币Swap交易所是一种点对点的交易方式&#x…...

spring boot中使用Bean Validation做优雅的参数校验
一、Bean Validation简介 Bean Validation是Java定义的一套基于注解的数据校验规范,目前已经从JSR 303的1.0版本升级到JSR 349的1.1版本,再到JSR 380的2.0版本(2.0完成于2017.08),目前最新稳定版2.0.2(201…...

搜索引擎项目
认识搜索引擎 1、有一个主页、有搜索框。在搜索框中输入的内容 称为“查询词” 2、还有搜索结果页,包含了若干条搜索结果 3、针对每一个搜索结果,都会包含查询词或者查询词的一部分或者和查询词具有一定的相关性 4、每个搜索结果包含好几个部分&…...

7.外部存储器,Cache,虚拟存储器
目录 一. 外部存储器 (1)磁盘存储器 1.磁盘的组成 2.磁盘的性能指标 3.磁盘地址 4.硬盘的工作过程 5.磁盘阵列 (2)固态硬盘(SSD) 二. Cache基本概念与原理 三. Cache和主存的映射方式 ÿ…...

UITableView的style是UITableViewStyleGrouped
一般情况下,UITableViewStylePlain和UITableViewStyleGrouped是UITableView常用到的style, 之前都是用到的时候,遇到问题直接用度娘,差不多就够用了,今天在修复UI提出的间隙问题,来回改,总觉得…...

Java17新增特性
前言 前面的文章,我们对Java9、Java10、Java11、Java12 、Java13、Java14、Java15、Java16 的特性进行了介绍,对应的文章如下 Java9新增特性 Java10新增特性 Java11新增特性 Java12新增特性 Java13新增特性 Java14新增特性 Java15新增特性 Java16新增特…...

VR全景技术在城市园区发展中有哪些应用与帮助
引言: 在数字化时代的浪潮中,虚拟现实(VR)全景技术逐渐融入各个领域,也为城市园区展示带来了全新的可能性。 一.VR全景技术简介 虚拟现实全景技术是一种通过全景图像和视频模拟真实环境的技术。通过相关设…...

在 SQL 中,当复合主键成为外键时应该如何被其它表引用
文章目录 当研究一个问题慢慢深入时,一个看起来简单的问题也暗藏玄机。在 SQL 中,主键成为外键这是一个很平常的问题,乍一看没啥值得注意的。但如果这个主键是一种复合主键,而另一个表又引用这个键作为它的复合主键,问…...

Ps:通过显示大小了解图像的打印尺寸
在 Photoshop 中,如果想了解文档窗口中的图像打印出来之后的实质大小,只要知道两个数值即可。 第一个数值是图像分辨率(也称“文档分辨率”)的大小,可在Ps菜单:图像/图像大小 Image Size对话框中查询或设置…...
Linux - 驱动开发 - watchdog - SMP机制下多核确活
说明 理论上:不管IC是单核还是多核,只要watchdog有被循环feed,就不会触发超时重启,因此watchdog在SMP机制下的多核环境显得比较宽松,只要任意核存活(喂狗)就不会重启设备。 实际情况 有客户反…...
概念解析 | LoRA:低秩矩阵分解在神经网络微调中的魔力
注1:本文系“概念解析”系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是:基于低秩矩阵分解的神经网络微调方法LoRA LoRA:低秩矩阵分解在神经网络微调中的魔力 Low-Rank Adaptation of Large Language Models LoRA由如下论文提出,详细信息请参见论文原…...

量子计算和量子通信技术:引领潜力无限的未来
近年来,随着量子计算和量子通信技术的迅速发展,它们在各个领域的广泛应用前景引起了人们的极大兴趣。本文将深入探讨量子计算和量子通信技术的普遍应用,以及它们预示的未来,同时提出业内人士需要注意的事项。 介绍:量子…...

nodejs+vue+python+PHP+微信小程序-安卓- 电影在线订票系统的设计与实现-计算机毕业设计推荐
目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性:…...
LightDB23.4支持mysql aes_encrypt/aes_decrypt/hex/unhex函数
背景介绍 为了兼容mysql数据库的功能,在LightDB23.4版本上支持hex/unhex/aes_encrypt/aes_decrypt函数。 函数原型如下: hex(data bytea) returns textunhex(data varchar) returns byteaaes_encrypt(data bytea, key bytea) returns byteaaes_encryp…...

uniapp——项目day04
购物车页面——商品列表区域 渲染购物车商品列表的标题区域 1. 定义如下的 UI 结构: 2.美化样式 渲染商品列表区域的基本结构 1. 通过 mapState 辅助函数,将 Store 中的 cart 数组映射到当前页面中使用: import badgeMix from /mixins/tab…...

7-爬虫-中间件和下载中间件(加代理,加请求头,加cookie)、scrapy集成selenium、源码去重规则(布隆过滤器)、分布式爬虫
0 持久化(pipelines.py)使用步骤 1 爬虫中间件和下载中间件 1.1 爬虫中间件(一般不用) 1.2 下载中间件(代理,加请求头,加cookie) 1.2.1 加请求头(加到请求对象中) 1.2.2 加cookie 1.2.3 加代理 2 scrapy集成selenium 3 源码去重…...
创建自己的nas服务,从远端拉取所需文件
一、前言 创建一个nas文件存储,然后需要的时候随时从远端或者其他终端拉取所需文件是不是一件很帅气的工作。 二、准备工作 一台服务器(云的更好),没了。 首先安装docker和docker-compose 此处省略docker的安装(改天更新)&…...

测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...

Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分: 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...