Java部分新特性
模式匹配
instance of 模式匹配
之前写法
public void print(Object o) {if (o instanceof String){String str = (String) obj;System.out.println("This is a String of length " + s.length());} else {System.out.println("This is not a String");}
}
java 14之后引入了新的模式匹配特性,允许在instanceof检查之后直接进行类型转换,而不需要显式地进行类型转换。
public void print(Object o) {if (o instanceof String s){System.out.println("This is a String of length " + s.length());} else {System.out.println("This is not a String");}
}
Switch模式匹配
Switch 的模式匹配是 JDK 21 的最终功能。它在 Java SE 17、18、19 和 20 中作为预览功能推出。
Object o = ...; // any object
String formatter = 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);default -> String.format("Object %s", o.toString());
};
switch 的模式匹配不仅能提高代码的可读性,还能提高代码的性能。if-else-if 语句的求值与该语句的分支数成正比;分支数加倍会使求值时间加倍。switch 的求值与 case 数无关。 if 语句的时间复杂度为O(n),而 switch 语句的时间复杂度为O(1)。
Record
record是一种特殊的不可变类型,java16 成为正式特性
public record Point(int x, int y) {}
- record 中的字段是隐式 final,一旦创建实例后,其字段值无法更改
- Java 会自动为 record 类生成 equals()、hashCode()、toString() 和构造函数等常用方法。
- record还可以定义方法和自定义构造函数。
public record State(String name, String capitalCity, List<String> cities) {public State {// List.copyOf returns an unmodifiable copy,// so the list assigned to `cities` can't change anymorecities = List.copyOf(cities);}public State(String name, String capitalCity) {this(name, capitalCity, List.of());}public State(String name, String capitalCity, String... cities) {this(name, capitalCity, List.of(cities));}}
- record不支持继承,但可以实现接口
public record Person(String name, int age) implements Greetable {@Overridepublic String greet() {return "Hello, " + name;}
}interface Greetable {String greet();
}
适用于表示只包含数据的对象,例如 DTO(数据传输对象)、VO(值对象)等,在需要确保不可变数据的情况下非常有用。
Record Pattern
Java 的 Record Pattern 是从 Java 16 引入,Java 21作为正式特性的一种模式匹配特性,用于简化对 record 类型的解构和模式匹配操作。
通过模式直接访问 record 的字段,而不需要显式调用 getter 方法。与 switch 和 instanceof 结合:可以在 switch 表达式或 if 语句中对 record 进行模式匹配。
Object o = ...; // any object
if (o instanceof Point(int x, int y)) {// do something with x and y
}
虚拟线程
Java 19引入了虚拟线程,并且在Java 21成为正式特性。
虚拟线程对并发任务数量很大且任务大多在网络 I/O 上阻塞时很有用,但对CPU密集型任务没有任何好处。
虚拟线程特点
- 在同一个线程组中:所有虚拟线程都被组织在一个线程组中,这意味着它们可以被统一管理和监控。
- 优先级为 NORM_PRIORITY:虚拟线程的默认优先级为正常优先级。
- 是守护线程:所有虚拟线程都是守护线程。
平台线程与虚拟线程
只有当虚拟线程执行实际工作时,才会将其分配给平台线程(载体线程)
| Parameter | 平台线程 | 虚拟线程 |
|---|---|---|
| 堆栈大小 | 1 MB | 动态调整 |
| 启动时间 | > 1000 µs | 1-10 µs |
| 上下文切换时间 | 1-10 µs | ~ 0.2 µs |
| 可允许线程数 | < 5000 | 百万 |
虚拟线程的栈存储在堆中,作为栈块对象(stack chunk objects),使虚拟线程能够动态管理内存,避免固定大小的栈带来的内存浪费。当虚拟线程需要更多的栈空间(比如进入更深的函数调用时),它的栈会增长。相反,当不再需要那么多栈空间时,栈可以缩小。而平台线程的栈是直接由操作系统分配,与每个线程相关的栈空间通常是存储在操作系统的内存中。
如何正确使用虚拟线程
- 不要使用虚拟线程执行CPU密集型任务
- 在每个请求线程模型中编写阻塞同步代码
- 不要使用虚拟线程池
- 使用信号量(semaphores)而不是固定线程池来限制并发
- 谨慎使用threadLocal或使用ScopedValue代替(ScopedValue 是一个泛型类,允许在当前线程(或虚拟线程)及其子线程中共享一个值。它是一种轻量级的方式来管理线程的上下文信息,无需使用传统的线程局部变量)
- 谨慎使用synchronized,可使用reentrant locks代替。synchronized由于其监视器锁的实现机制,一旦线程获取了锁,就会固定在平台线程上,直到锁被释放 。 相比之下,ReentrantLock提供了更灵活的锁定机制,允许虚拟线程在遇到阻塞操作时从其承载的平台线程上卸载,让出平台线程给其他虚拟线程使用。
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;public class JavaDemoApplication {public static void main(String[] args) throws InterruptedException, ExecutionException {ExecutorService service = Executors.newVirtualThreadPerTaskExecutor();List<Callable<String>> callables = new ArrayList<>();final int ADJECTIVES = 4;for (int i = 1; i <= ADJECTIVES; i++)callables.add(() -> get("https://horstmann.com/random/adjective"));callables.add(() -> get("https://horstmann.com/random/noun"));List<String> results = new ArrayList<>();for (Future<String> f : service.invokeAll(callables))results.add(f.get());System.out.println(String.join(" ", results));service.close();}private static final HttpClient client = HttpClient.newHttpClient();public static String get(String url) {try {var request = HttpRequest.newBuilder().uri(new URI(url)).GET().build();return client.send(request, HttpResponse.BodyHandlers.ofString()).body();} catch (Exception ex) {throw new RuntimeException(ex);}}
}
文本块
Java 文本块(Text Blocks)是在Java 13 引入,在Java 15被作为正式特性,用于更方便地处理多行字符串。文本块通过三引号 (“”") 语法来定义,可以用来表示跨多行的字符串,从而解决了传统多行字符串拼接时的许多麻烦。文本块使得字符串的定义更加简洁、可读和易于维护,特别是在处理包含换行符、缩进或多行文本时。
// ORIGINAL
String message = "'The time has come,' the Walrus said,\n" +"'To talk of many things:\n" +"Of shoes -- and ships -- and sealing-wax --\n" +"Of cabbages -- and kings --\n" +"And why the sea is boiling hot --\n" +"And whether pigs have wings.'\n";// BETTER
String message = """'The time has come,' the Walrus said,'To talk of many things:Of shoes -- and ships -- and sealing-wax --Of cabbages -- and kings --And why the sea is boiling hot --And whether pigs have wings.'""";
Compactor Strings
在 JDK 9 中,java.lang.String、StringBuilder 和 StringBuffer 类的内部字符存储已从 UTF-16 char数组更改为byte数组加上一个字节的编码标志字段。新的存储表示根据字符串的内容将字符存储/编码为 ISO-8859-1/Latin-1(每个字符一个字节)或 UTF-16(每个字符两个字节)。新添加的编码标志字段指示使用哪种编码。如果 String 对象仅包含单字节/latin-1 字符,则此功能将 String 对象存储字符所需的空间量减少了 50%。
来源
https://dev.java/
https://www.oracle.com/java/
相关文章:
Java部分新特性
模式匹配 instance of 模式匹配 之前写法 public void print(Object o) {if (o instanceof String){String str (String) obj;System.out.println("This is a String of length " s.length());} else {System.out.println("This is not a String");} …...
【SpringBoot】28 API接口防刷(Redis + 拦截器)
Gitee仓库 https://gitee.com/Lin_DH/system 介绍 常用的 API 安全措施包括:防火墙、验证码、鉴权、IP限制、数据加密、限流、监控、网关等,以确保接口的安全性。 常见措施 1)防火墙 防火墙是网络安全中最基本的安全设备之一,…...
IT运维专家给年轻人一些职业上的建议
运维工作在现代企业中是非常重要的一环,保证系统的稳定性、可用性以及安全性对企业的正常运营至关重要。以下是我给年轻人的一些职业发展建议,希望能够帮助你们在运维领域找到方向并取得成功。 1. 夯实基础,扎实技术功底 精通操作系统与网络:运维工作需要深入理解操作系统…...
Django基础之路由
一.前言 前面我们说了django的安装于基础配置,基础知识点我就细分下来,每天和大家讲一点,今天就要和大家说django的基础知识点了,我们今天先来讲路由,内容不多,希望大家记住 二.传统路由 路由就是前面一个…...
Python实例化中默认值的行为及应用
Python实例化中默认值的行为及应用 适合初学者阅读 本文要点 使用可变对象作为默认参数会导致所有实例共享同一对象,引发意外的数据修改。不可变对象作为默认参数时,每次实例化都会创建新的对象,不会共享数据。推荐使用None作为默认值&…...
【WRF后处理】WRF模拟效果评价及可视化:MB、RMSE、IOA、R
【WRF后处理】模拟效果评价及可视化 准备工作模型评价指标Python实现代码Python处理代码:导入站点及WRF模拟结果可视化图形及评价指标参考在气象和环境建模中(如使用 WRF 模型进行模拟),模型性能评价指标是用于定量评估模拟值与观测值之间偏差和拟合程度的重要工具。 本博客…...
ShenNiusModularity项目源码学习(4:身份认证)
ShenNiusModularity项目有两套启动方式,一种是ShenNius.Admin.Mvc项目启动,该项目为MVC模式,带前台页面,也有后台服务,另一种是ShenNius.Admin.Hosting,该项目启动后仅提供后台服务,供其它前台项…...
python+django自动化部署日志采用WebSocket前端实时展示
一、开发环境搭建和配置 # channels是一个用于在Django中实现WebSocket、HTTP/2和其他异步协议的库。 pip install channels#channels-redis是一个用于在Django Channels中使用Redis作为后台存储的库。它可以用于处理#WebSocket连接的持久化和消息传递。 pip install channels…...
flink学习(6)——自定义source和kafka
概述 SourceFunction:非并行数据源(并行度只能1) --接口 RichSourceFunction:多功能非并行数据源(并行度只能1) --类 ParallelSourceFunction:并行数据源(并行度能够>1) --接口 RichParallelSourceFunction:多功能并行数据源(并行度能够>1) --类 【建议使用的】 ——…...
开发常见问题及解决
1.DBeaver 报Public Key Retrieval is not allowed 在使用DBeaver连接数据库时出现“Public Key Retrieval is not allowed”错误,主要是因为数据库连接配置的安全策略导致的。以下是详细的解释和解决方法: 错误原因 这个错误通常出现在连接MySQL数据…...
python excel接口自动化测试框架!
今天采用Excel继续写一个接口自动化测试框架。 设计流程图 这张图是我的excel接口测试框架的一些设计思路。 首先读取excel文件,得到测试信息,然后通过封装的requests方法,用unittest进行测试。 其中,接口关联的参数通过正则进…...
mybatis:You have an error in your SQL syntax;
完整报错You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near false, false, false, false, false, false, false, false, false, false, false, at line 1 SQL: INSERT INTO user …...
使用 Maven 开发 IntelliJ IDEA 插件
使用 Maven 开发 IntelliJ IDEA 插件的完整流程 1. 创建 Maven 项目 1.1 使用 IntelliJ 创建 Maven 项目 打开 IntelliJ IDEA,点击 File > New > Project。选择 Maven,填写项目名称和 GroupId,例如: GroupId: com.exampl…...
Windows修复SSL/TLS协议信息泄露漏洞(CVE-2016-2183) --亲测
漏洞说明: 打开链接:https://docs.microsoft.com/zh-cn/troubleshoot/windows-server/windows-security/restrict-cryptographic-algorithms-protocols-schannel 可以看到: 找到:应通过配置密码套件顺序来控制 TLS/SSL 密码 我们…...
uniapp生命周期:应用生命周期和页面生命周期
文章目录 1.应用的生命周期2.页面的生命周期 1.应用的生命周期 生命周期的概念:一个对象从创建、运行、销毁的整个过程被称为生命周期 生命周期函数:在生命周期中每个阶段会伴随着每一个函数的出发,这些函数被称为生命周期函数 所有页面都…...
基于SSM的婴幼儿用品商城系统+LW示例参考
1.项目介绍 功能模块:管理员(产品管理、产品分类、会员管理、订单管理、秒杀活动、文章管理、数据统计等)、普通用户(登录注册、个人中心、购物车、我的收藏、各类信息查看等)技术选型:SSM,jsp…...
【工具变量】城市供应链创新试点数据(2007-2023年)
一、测算方式:参考C刊《经济管理》沈坤荣和乔刚老师(2024)的做法,使用“供应链创新与应用试点”的政策虚拟变量(TreatPost)表征。若样本城市为试点城市,则赋值为 1,否则为 0…...
【carla生成车辆时遇到的问题】carla显示的坐标和carlaworld中提取的坐标y值相反
项目需要重新运行了一下generate_car.py的脚本,发现死活生成不了,研究了半天,发现脚本里面生成车辆的坐标值y和carla_ros_bridge_with_example_ego_vehicle.launch脚本打开的驾驶操控界面里面的y值正好是相反数! y1-y2 因为,我运行…...
Jira使用笔记二 ScriptRunner 验证问题创建角色
背景 最近在对公司Jira工作流改造,收到这么一个要求:某些问题类型只有某些角色可以创建。本来是想通过Jira内建的权限控制来处理的。结果点到权限页面,心都凉透了。 好吧,那只能上脚本了。最终使用ScriptRunner的Simple scripte…...
Java线程的使用
Java中的线程是用来实现多任务并发执行的机制。在Java中,主要有两种方式来创建和使用线程:实现Runnable接口和继承Thread类。 实现Runnable接口: 创建一个类,实现Runnable接口,并重写run()方法。在run()方法中定义线程…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...
零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...
Linux 中如何提取压缩文件 ?
Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...
打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...
Caliper 配置文件解析:fisco-bcos.json
config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...
