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…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...
select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...
Chrome 浏览器前端与客户端双向通信实战
Chrome 前端(即页面 JS / Web UI)与客户端(C 后端)的交互机制,是 Chromium 架构中非常核心的一环。下面我将按常见场景,从通道、流程、技术栈几个角度做一套完整的分析,特别适合你这种在分析和改…...
SpringAI实战:ChatModel智能对话全解
一、引言:Spring AI 与 Chat Model 的核心价值 🚀 在 Java 生态中集成大模型能力,Spring AI 提供了高效的解决方案 🤖。其中 Chat Model 作为核心交互组件,通过标准化接口简化了与大语言模型(LLM࿰…...
基于鸿蒙(HarmonyOS5)的打车小程序
1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...
