Java 18 新特性解析

Java 18 于 2022 年 3 月发布,为开发者带来了许多新功能和改进。相比 Java 8,Java 18 在多个方面都进行了优化和增强。这篇博客将深入探讨 Java 18 的主要新特性,并与 Java 8 进行对比,帮助开发者更好地理解和利用这些更新。

1. 简化的字符集

Java 8

在 Java 8 中,默认字符集是 ISO-8859-1。处理多语言文本时,开发者通常需要显式指定 UTF-8 字符集。

Java 18

Java 18 中,默认字符集从 ISO-8859-1 更改为 UTF-8。这一更改简化了字符处理,尤其是在处理多语言文本时,减少了代码的复杂性和潜在的错误。

示例代码对比

// Java 8 中
String text = "你好,世界!";
byte[] bytes = text.getBytes(StandardCharsets.UTF_8);
String decoded = new String(bytes, StandardCharsets.UTF_8);
System.out.println(decoded); // 输出:你好,世界!// Java 18 中
String text = "你好,世界!";
byte[] bytes = text.getBytes();
String decoded = new String(bytes);
System.out.println(decoded); // 输出:你好,世界!

2. 新的 SimpleWebServer

Java 8

Java 8 中没有内置的简单 Web 服务器。开发者通常需要依赖第三方库或框架(如 Jetty、Tomcat)来进行本地开发和测试。

Java 18

Java 18 引入了一个简单的 Web 服务器 SimpleWebServer,非常适合用于本地开发和测试。它可以快速启动,不需要复杂的配置。

启动示例对比

# Java 18 中,在命令行中启动简单的 Web 服务器
java -m jdk.httpserver

或使用以下代码在 Java 应用程序中启动服务器:

import com.sun.net.httpserver.SimpleFileServer;
import com.sun.net.httpserver.SimpleFileServer.OutputLevel;
import java.net.InetSocketAddress;// Java 18 中
public class SimpleWebServerExample {public static void main(String[] args) {var server = SimpleFileServer.createFileServer(new InetSocketAddress(8000), java.nio.file.Path.of("."), OutputLevel.VERBOSE);server.start();System.out.println("Server started at http://localhost:8000");}
}

3. 代码段 API(JEP 413)

Java 8

Java 8 中没有专门的 API 用于从源文件中提取代码段并包含在生成的文档中。开发者通常需要手动复制代码或使用外部工具。

Java 18

Java 18 提供了新的代码段 API(Code Snippets API),用于文档生成工具,可以从 Java 源文件中提取代码段并包含在生成的文档中。

示例代码段

/*** This is a sample class.* {@snippet :* public class HelloWorld {*     public static void main(String[] args) {*         System.out.println("Hello, World!");*     }* }}*/
public class HelloWorldSnippet {// class implementation
}

4. 向量 API(第三孵化版)

Java 8

Java 8 没有向量 API。开发者需要使用第三方库(如 Apache Commons Math)来实现矢量计算。

Java 18

向量 API(Vector API)提供了一种处理矢量计算的高效方式,特别适用于数据并行操作。虽然目前仍在孵化阶段,但它展示了 Java 对高性能计算领域的支持。

示例代码

import jdk.incubator.vector.FloatVector;
import jdk.incubator.vector.VectorSpecies;// Java 18 中
public class VectorExample {private static final VectorSpecies<Float> SPECIES = FloatVector.SPECIES_256;public static void main(String[] args) {float[] a = {1.0f, 2.0f, 3.0f, 4.0f};float[] b = {1.0f, 2.0f, 3.0f, 4.0f};FloatVector va = FloatVector.fromArray(SPECIES, a, 0);FloatVector vb = FloatVector.fromArray(SPECIES, b, 0);FloatVector vc = va.add(vb);vc.intoArray(a, 0);for (float f : a) {System.out.println(f); // 输出 2.0, 4.0, 6.0, 8.0}}
}

5. 增强的 Pattern Matching(模式匹配)

Java 8

Java 8 中,模式匹配功能非常有限。开发者需要使用 instanceof 和类型转换来处理不同类型的数据。

Java 18

Java 18 继续改进模式匹配功能,使得处理复杂的数据结构更加简便。这些增强的模式匹配功能使代码更加简洁和可读。

示例代码对比

// Java 8 中
public class PatternMatchingExampleJava8 {static void printObject(Object obj) {if (obj instanceof String) {String s = (String) obj;System.out.println("String: " + s);} else if (obj instanceof Integer) {Integer i = (Integer) obj;System.out.println("Integer: " + i);} else {System.out.println("Unknown object");}}public static void main(String[] args) {printObject("Hello, World!"); // 输出:String: Hello, World!printObject(123); // 输出:Integer: 123}
}// Java 18 中
public class PatternMatchingExample {static void printObject(Object obj) {if (obj instanceof String s) {System.out.println("String: " + s);} else if (obj instanceof Integer i) {System.out.println("Integer: " + i);} else {System.out.println("Unknown object");}}public static void main(String[] args) {printObject("Hello, World!"); // 输出:String: Hello, World!printObject(123); // 输出:Integer: 123}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/19500.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

艾体宝方案 | redis赋能游戏开发,游戏玩家纵享丝滑

掉线&#xff0c;加载缓慢&#xff0c;反馈无跟进&#xff0c;这些令游戏玩家炸毛的问题&#xff0c;同时也是游戏开发者关注的问题。开发者将目光投向了Redis&#xff0c;一个实时数据平台&#xff0c;告别卡顿延迟&#xff01; 一、玩家不掉线&#xff0c;游戏更丝滑 在大型…

NVIDIA Blackwell Architecture

本文翻译自&#xff1a;NVIDIA Blackwell Architecture https://www.nvidia.com/en-us/data-center/technologies/blackwell-architecture/ 文章目录 了解技术突破1、新型人工智能超级芯片2、第二代 Transformer 引擎3、Secure AI4、NVLink 和 NVLink 交换机5、解压缩引擎6、可…

VNC server ubuntu20 配置

介绍 最近想使用实验室的4卡服务器跑一些深度学习实验&#xff0c;因为跑的是三维建图实验&#xff0c;需要配上可视化界面&#xff0c;本来自带的IPMI可以可视化&#xff0c;但分辨率固定在640*480&#xff0c;看起来很别扭&#xff0c;就捣鼓服务器远程可视化访问了两天&…

python项目开发——个人任务管理系统

项目名称&#xff1a;个人任务管理系统 (Personal Task Management System) 项目简介 开发一个个人任务管理系统&#xff0c;帮助用户记录和管理日常任务。该系统应具备添加任务、查看任务、更新任务状态和删除任务等基本功能&#xff0c;并将数据存储在文件中。通过完成该项目…

vue2转vue3初步下载pnpm遇到的问题 pnpm : 无法加载文件 D:\nodejs\pnpm.ps1

安装pnpm npm install -g pnpm pnpm -v 提示&#xff1a; 解决&#xff1a;nvm install 18.18.0 下载最稳定版本的nodejs nvm use 18.18.0 然后注意重新下载删除pnpm npm uninstall -g pnpm npm install -g pnpmlatest 在vscode使用pnpm报错 解决&#xff1a;管理员运行Windo…

web项目规范配置(husky、eslint、lint-staged、commit)

背景&#xff1a; 团队开发为了保证提交代码格式统一&#xff0c;通常在进行代码提交的时候对暂存区代码进行校验&#xff0c;如没有通过eslint(本例使用eslint)校验&#xff0c;则不能提交到远端。 安装依赖 husky 、eslint 、prettier 、lint-staged npm install husky e…

Satellite Stereo Pipeline学习

1.在Anaconda某个环境中安装s2p pip install s2p 2.在Ubuntu系统中安装s2p源代码 git clone https://github.com/centreborelli/s2p.git --recursive cd s2p pip install -e ".[test]" 3.在s2p中进行make all处理 中间会有很多情况&#xff0c;基本上哪个包出问题…

基于网关的ip频繁访问web限制

一、前言 外部ip对某一个web进行频繁访问&#xff0c;有可能是对web进行攻击&#xff0c;现在提供一种基于网关的ip频繁访问web限制策略&#xff0c;犹如带刀侍卫&#xff0c;审查异常身份人员。如发现异常或者暴力闯关者&#xff0c;即可进行识别管制。 二、基于网关的ip频繁访…

【Python】 倒序遍历列表:Python中的简单技巧

基本原理 在Python中&#xff0c;列表是一种非常灵活的数据结构&#xff0c;它允许我们存储一系列的元素。有时&#xff0c;我们需要按照与元素添加顺序相反的顺序来遍历列表。这通常被称为“倒序遍历”。Python提供了几种不同的方法来实现这一功能。 代码示例 示例1&#x…

国内常用的编程博客网址:技术资源与学习平台

一、国内常用的编程博客网址&#xff1a;技术资源与学习平台 大家初入编程&#xff0c;肯定会遇到各种各样的问题。我们除了找 AI 工具以外&#xff0c;我们还能怎么迅速解决问题呢&#xff1f; 大家可以通过谷歌&#xff0c;百度&#xff0c;必应&#xff0c;github&#xf…

****三次握手和四次挥手

一、三次握手 1.简要描述TCP三次握手的过程 第一次握手&#xff0c;客户端发送SYN包到服务器&#xff1b; 第二次握手&#xff0c;服务器收到SYN包&#xff0c;回复一个SYNACK包&#xff1b; 第三次握手&#xff0c;客户端收到服务器的SYNACK包后&#xff0c;回复一个ACK包…

C++ 使用 nlohmann/json 库

C常用 json 库有&#xff1a; Jsoncpp boost ison Qt Json (不推荐使用) nlohman::json (推荐使用) 其中Qt中json解析的相关类只在qt中有用&#xff0c;为了避免以后不用qt无法解析json&#xff0c;建议使用nlohmann/json&#xff0c;适用于任何C框架。 1. 简介 nlohmann是一…

【vueCms】vueCms后台管理系统安装问题集合

开源项目地址: https://www.vuecms.cn/ 开源代码地址: https://gitee.com/derekgo/vue-cms_xg 问题一 如果出现提示少了个index.html。如下图 解决办法: 重新安装前端(vue3_vite)项目依赖 问题二 npm版本高无法解析依赖树导致依赖下载失败 解决方案: npm install --legacy…

Vue.use的实现原理

一、Vue.use 是做什么的&#xff1f; use 概念 如果你希望编写一个 Vue.js 插件来扩展应用的功能&#xff0c;需要提供一个 install 方法。如果插件是一个对象&#xff0c;那么这个对象必须包含 install 方法&#xff1b;如果插件是一个函数&#xff0c;那么这个函数将被作为 …

【Flask-app.py运行】已解决Cannot run program “D:\APP\python\python.exe”

文章目录 一、问题描述二、解决方法 一、问题描述 Cannot run program “D:\APP\python\python.exe” (in directory “F:\Codes\竞赛\大计赛\group\code\web\web”): CreateProcess error2, 系统找不到指定的文件。 这段报错源于运行 flask 项目的 app.py 时报错找不到程序&…

C++ | Leetcode C++题解之第119题杨辉三角II

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<int> getRow(int rowIndex) {vector<int> row(rowIndex 1);row[0] 1;for (int i 1; i < rowIndex; i) {row[i] 1LL * row[i - 1] * (rowIndex - i 1) / i;}return row;} };

SNCScan:针对SAP安全网络通信(SNC)的安全分析与评估工具

关于SNCScan SNCScan是一款针对SAP安全网络通信&#xff08;SNC&#xff09;的安全分析与评估工具&#xff0c;该工具旨在帮助广大研究人员分析SAP安全网络通信&#xff08;SNC&#xff09;&#xff0c;并分析和检测SNC配置与SAP组件中的潜在问题。 SNC系统参数 SNC基础 SAP协…

flutter sdk升级之空安全启用

公司项目flutter sdk需要从2.5升级到3.7。由于项目不支持空安全&#xff0c;所以升级sdk之前要做的第一件事就是启用空安全。以下为空安全适配过程记录。 启用空安全 将dart sdk设置成sdk: ">2.12.0 <3.0.0"&#xff0c;即可启用。代码如下&#xff1a; envi…

面向Java程序员的Go工程开发入门流程

对于一个像我这样没有go背景的java程序员来说&#xff0c;使用go开发一个可用的程序的速度是肉眼可见的缓慢。 其难点不在于go语言本身&#xff0c;而是搭建整个工程链路的过程&#xff0c;即所谓的“配环境”。 本文主要讲述如何配出一个适合go开发的环境&#xff0c;以免有同…

未来工厂新篇章:大型工厂3D可视化技术引领工业新潮流

在科技日新月异的今天&#xff0c;大型工厂不再是我们印象中机器轰鸣、尘土飞扬的钢铁丛林&#xff0c;而是变成了智慧与效率并存的现代化生产中心。这一切的改变&#xff0c;都离不开一项革命性的技术——3D可视化。 一、何为大型工厂3D可视化&#xff1f; 大型工厂3D可视化&…