Java 18 新特性
Java 作为一门广泛应用于企业级开发和系统编程的编程语言,一直以来都在不断进化和改进。2022 年发布的 Java 18 版本为开发者带来了一些新的特性和改进,这些特性不仅提升了开发效率,还进一步增强了 Java 语言的功能和灵活性。本文将深入探讨 Java 18 的主要新特性及其应用场景。
一、新特性概述
Java 18 版本的主要新特性包括:
- UTF-8 默认字符集
- 简化的 Web 服务器 API
Vector API第二孵化版Pattern Matching for switch第三预览版Code Snippets in Java API Documentation第三预览版- 重新启用
Finalization和弃用AppCDS Foreign Function & Memory API第二孵化版
这些新特性不仅改善了开发者的编码体验,还提高了应用程序的性能和可维护性。
二、详细介绍新特性
1. UTF-8 默认字符集
在 Java 18 之前,Java 应用程序的默认字符集取决于操作系统的区域设置。这种情况可能导致在不同平台上运行时出现字符编码问题。Java 18 将 UTF-8 设为默认字符集,这意味着无论操作系统的区域设置如何,Java 应用程序都将使用 UTF-8 进行编码和解码。
应用场景:
- 跨平台开发:确保应用程序在不同操作系统上运行时字符编码一致。
- 国际化支持:UTF-8 能更好地支持多语言环境,特别是在处理非 ASCII 字符时。
示例代码:
import java.nio.charset.StandardCharsets;
import java.util.Locale;public class Utf8Example {public static void main(String[] args) {System.out.println("Default Charset: " + StandardCharsets.UTF_8);String text = "你好, Java 18!";byte[] bytes = text.getBytes(StandardCharsets.UTF_8);String decodedText = new String(bytes, StandardCharsets.UTF_8);System.out.println("Decoded Text: " + decodedText);}
}
2. 简化的 Web 服务器 API
Java 18 引入了一个新的简单 Web 服务器 API,适用于测试、原型开发和小规模应用。这一新 API 提供了一个简单的方法来创建 HTTP 服务器,减少了配置和代码量。
应用场景:
- 快速原型开发:无需复杂配置即可启动一个 HTTP 服务器,方便快速验证想法。
- 测试环境:轻量级 HTTP 服务器适用于集成测试和功能测试。
示例代码:
import com.sun.net.httpserver.HttpServer;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpExchange;import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;public class SimpleHttpServer {public static void main(String[] args) throws IOException {HttpServer server = HttpServer.create(new InetSocketAddress(8000), 0);server.createContext("/hello", new HelloHandler());server.setExecutor(null); // 使用默认的执行器server.start();System.out.println("Server started on port 8000");}static class HelloHandler implements HttpHandler {@Overridepublic void handle(HttpExchange exchange) throws IOException {String response = "Hello, World!";exchange.sendResponseHeaders(200, response.length());OutputStream os = exchange.getResponseBody();os.write(response.getBytes());os.close();}}
}
3. Vector API 第二孵化版
Vector API 提供了一种新的方式来编写高性能的向量化计算代码。向量化计算可以显著提高某些计算密集型任务的性能,如图像处理、信号处理和科学计算。
应用场景:
- 高性能计算:提高计算密集型任务的执行效率。
- 数值分析:加速大规模矩阵运算和数值计算。
示例代码:
import jdk.incubator.vector.DoubleVector;
import jdk.incubator.vector.VectorSpecies;public class VectorExample {private static final VectorSpecies<Double> SPECIES = DoubleVector.SPECIES_PREFERRED;public static void main(String[] args) {double[] a = {1.0, 2.0, 3.0, 4.0};double[] b = {5.0, 6.0, 7.0, 8.0};double[] c = new double[a.length];for (int i = 0; i < a.length; i += SPECIES.length()) {DoubleVector va = DoubleVector.fromArray(SPECIES, a, i);DoubleVector vb = DoubleVector.fromArray(SPECIES, b, i);DoubleVector vc = va.add(vb);vc.intoArray(c, i);}for (double v : c) {System.out.println(v);}}
}
4. Pattern Matching for switch 第三预览版
Pattern Matching for switch 进一步扩展了 Java 的模式匹配功能,使得 switch 语句可以对多种类型进行模式匹配。这一特性简化了代码逻辑,使得代码更具可读性和维护性。
应用场景:
- 简化代码逻辑:减少繁琐的类型检查和转换代码。
- 提高代码可读性:通过模式匹配使代码更加直观。
示例代码:
public class PatternMatchingSwitch {public static void main(String[] args) {Object obj = "Hello, Java 18!";String result = switch (obj) {case Integer i -> "Integer: " + i;case String s -> "String: " + s;default -> "Unknown type";};System.out.println(result);}
}
5. Code Snippets in Java API Documentation 第三预览版
Java 18 增加了在 API 文档中嵌入代码片段的支持,使得文档更加直观和易于理解。开发者可以在 Javadoc 注释中添加代码片段,直接展示使用示例。
应用场景:
- API 文档:提高文档的可读性和实用性,帮助开发者更好地理解和使用 API。
- 教学示例:在文档中提供具体的使用示例,便于学习和参考。
示例代码:
/*** This class demonstrates a simple addition operation.* * {@snippet :* public static int add(int a, int b) {* return a + b;* }}*/
public class SnippetExample {public static void main(String[] args) {System.out.println(add(1, 2));}public static int add(int a, int b) {return a + b;}
}
6. 重新启用 Finalization 和弃用 AppCDS
Java 18 重新启用了 Finalization 机制,并计划在未来版本中移除。与此同时,弃用了应用程序类数据共享(AppCDS),建议开发者使用 CDS 替代。
应用场景:
- 资源管理:通过
finalize方法进行资源清理(虽然不建议使用)。 - 性能优化:使用 CDS 进行类数据共享,提高应用启动速度。
示例代码:
public class FinalizationExample {@Overrideprotected void finalize() throws Throwable {try {System.out.println("Finalize method called");} finally {super.finalize();}}public static void main(String[] args) {FinalizationExample example = new FinalizationExample();example = null;System.gc(); // 提示垃圾收集器进行垃圾收集}
}
7. Foreign Function & Memory API 第二孵化版
Foreign Function & Memory API 提供了一种安全、高效的方式来访问本地(非 Java)代码和内存。这一 API 是对 JNI 的现代替代,简化了跨语言互操作和本地内存访问。
应用场景:
- 跨语言调用:与 C/C++ 等其他编程语言进行互操作。
- 高效内存访问:直接访问本地内存,提高性能。
示例代码:
import jdk.incubator.foreign.CLinker;
import jdk.incubator.foreign.MemorySegment;
import jdk.incubator.foreign.ResourceScope;import java.lang.invoke.MethodHandle;public class ForeignFunctionExample {public static void main(String[] args) throws Throwable {CLinker linker = CLinker.systemCLinker();MethodHandle strlen = linker.downcallHandle(linker.lookup("strlen").get(),MethodType.methodType(long.class, MemorySegment.class),FunctionDescriptor.of(CLinker.C_LONG, CLinker.C_POINTER));try (ResourceScope scope = ResourceScope.newConfinedScope()) {MemorySegment cString = CLinker.to相关文章:
Java 18 新特性
Java 作为一门广泛应用于企业级开发和系统编程的编程语言,一直以来都在不断进化和改进。2022 年发布的 Java 18 版本为开发者带来了一些新的特性和改进,这些特性不仅提升了开发效率,还进一步增强了 Java 语言的功能和灵活性。本文将深入探讨 …...
c++基础创建对象
在C中,test a; 和 test a new test(); 是两种不同的初始化或创建对象的方式,而且它们之间存在根本的区别。 test a; 这是对象a的栈上分配。在声明test a;时,编译器会在栈上为a分配内存,并调用test类的默认构造函数(…...
WHAT - 容器化系列(二)- docker
目录 一、前言二、Docker镜像:可运行软件包三、Docker容器:可执行环境四、容器和镜像的关系五、创建镜像的过程5.1 编写Dockerfile5.2 构建Docker镜像5.3 查看构建的镜像5.4 运行Docker容器5.5 验证容器运行状态5.6 推送镜像到镜像仓库(可选&…...
力扣 19题 删除链表的倒数第 N 个结点 记录
题目描述 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例 1: 输入:head [1,2,3,4,5], n 2 输出:[1,2,3,5]示例 2: 输入:head [1], n 1 输出:[]示例 3&am…...
渗透测试之Web安全系列教程(二)
今天,我们来讲一下Web安全! 本文章仅提供学习,切勿将其用于不法手段! 目前,在渗透测试领域,主要分为了两个发展方向,分别为Web攻防领域和PWN(二进制安全)攻防领域。Web…...
【算法】在?复习一下快速排序?
基本概念 快速排序是一种基于交换的排序算法,该算法利用了分治的思想。 整个算法分为若干轮次进行。在当前轮次中,对于选定的数组范围[left, right],首先选取一个标志元素pivot,将所有小于pivot的元素移至其左侧,大于…...
matlab安装及破解
一、如何下载 软件下载链接,密码:98ai 本来我想自己生成一个永久百度网盘链接的,但是: 等不住了,所以大家就用上面的链接吧。 二、下载花絮 百度网盘下载速度比上载速度还慢,我给充了个会员,…...
Tree——输出项目的文件结构(Linux)
输出项目中的文件结构可以使用tree命令。tree是一个用于以树状结构显示目录内容的命令行工具。它非常适合快速查看项目的文件结构。安装: sudo apt-get install tree 使用: 在命令行中导航到项目的根目录,输出文件结构。 tree 也可以将结构输…...
UE5 读取本地图片并转换为base64字符串
调试网址:在线图像转Base64 - 码工具 (matools.com) 注意要加(data:image/png;base64,) FString UBasicFuncLib::LoadImageToBase64(const FString& ImagePath) {TArray<uint8> ImageData;// Step 1: 读取图片文件到字节数组if (!…...
【NOIP普及组】税收与补贴问题
【NOIP普及组】税收与补贴问题 💖The Begin💖点点关注,收藏不迷路💖 每样商品的价格越低,其销量就会相应增大。现已知某种商品的成本及其在若干价位上的销量(产品不会低于成本销售),…...
Docker 部署 mysql 服务
linux用法 Container(容器)集合成 Services(服务) 交互集合成 Stack(堆栈)卸载可能存在的旧版本 sudo apt-get update使apt可以通过HTTPS使用存储库(repository) sudo apt-get ins…...
01- Redis 中的 String 数据类型和应用场景
1. 介绍 String 是最基本的 key-value 结构,key 是唯一标识,value 是具体的值,value 其实不仅是字符串,也可以是数字(整数或浮点数),value 最多可以容纳的数据长度是 512M。 2. 内部实现 Str…...
Android音频焦点
什么是音频焦点? 音频焦点是 API 8 中引入的一个概念。它用于传达这样一个事实:用户一次只能专注于一个音频流,例如收听音乐或播客,但不能同时关注两者。在某些情况下,多个音频流可以同时播放,但只有一个是…...
Docker安全配置
Docker安全及日志管理 文章目录 Docker安全及日志管理资源列表基础环境一、Docker安全相关介绍1.1、Docker容器与虚拟机的区别1.1.1、隔离与共享1.1.2、性能与损耗 1.2、Docker存在的安全问题1.2.1、Docker自身漏洞1.2.2、Docker源码问题 1.3、Docker架构缺陷与安全机制1.3.1、…...
文件上传之使用一个属性接收多个文件
在开发过程中,可能遇到这样的业务:文件上传时个数不定,这样我们不能枚举出所有的文件name,这种情况下我们可以使用一个name将所有的文件接收下来; html代码 <!DOCTYPE html> <html lang"en"> …...
chat4-Server端保存聊天消息到mysql
本文档描述了Server端接收到Client的消息并转发给所有客户端或私发给某个客户端 同时将聊天消息保存到mysql 服务端为当前客户端创建一个线程,此线程接收当前客户端的消息并转发给所有客户端或私发给某个客户端同时将聊天消息保存到mysql 本文档主要总结了将聊天…...
vivo鄢楠:基于OceanBase 的降本增效实践
在3 月 20 日的2024 OceanBase 数据库城市行中,vivo的 体系与流程 IT 部 DBA 组总监鄢楠就“vivo 基于 OceanBase 的降本增效实践”进行了主题演讲。本文为该演讲的精彩回顾。 vivo 在1995年于中国东莞成立,作为一家全球领先的移动互联网智能终端公司&am…...
arm cortex-m架构 SVC指令详解以及其在freertos的应用
1. 前置知识 本文基于arm cortex-m架构描述, 关于arm cortex-m的一些基础知识可以参考我另外几篇文章: arm cortex-m 架构简述arm异常处理分析c语言函数调用规范-基于arm 分析 2 SVC指令 2.1 SVC指令位域表示 bit15 - bit12:条件码&#…...
k8s笔记——kubernetes中的三种IP
kubernetes概念 Master:集群控制节点,每个集群需要至少一个master节点负责集群的管控 Node:工作负载节点,由master分配容器到这些node工作节点上,然后node节点上的docker负责容器的运行 Pod:kubernetes的…...
Golang | Leetcode Golang题解之第127题单词接龙
题目: 题解: func ladderLength(beginWord string, endWord string, wordList []string) int {wordId : map[string]int{}graph : [][]int{}addWord : func(word string) int {id, has : wordId[word]if !has {id len(wordId)wordId[word] idgraph a…...
微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...
label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...
Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...
面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...
沙箱虚拟化技术虚拟机容器之间的关系详解
问题 沙箱、虚拟化、容器三者分开一一介绍的话我知道他们各自都是什么东西,但是如果把三者放在一起,它们之间到底什么关系?又有什么联系呢?我不是很明白!!! 就比如说: 沙箱&#…...
Python常用模块:time、os、shutil与flask初探
一、Flask初探 & PyCharm终端配置 目的: 快速搭建小型Web服务器以提供数据。 工具: 第三方Web框架 Flask (需 pip install flask 安装)。 安装 Flask: 建议: 使用 PyCharm 内置的 Terminal (模拟命令行) 进行安装,避免频繁切换。 PyCharm Terminal 配置建议: 打开 Py…...
