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()方法中定义线程…...
19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...
大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...
渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
