java21新特性
java21新特性
2023年9月20日,Oracle公司宣布Java 21正式发布。该版本是继JDK 17之后最新的长期支持版本(LTS),将获得至少8年的支持!
Java 21 号称具有数千项性能、稳定性和安全性改进。新的 JDK 21 包括对 15 项改进的抢先体验,这些增强功能是在 Oracle CloudWorld 2023 会议上宣布的,包括支持虚拟线程以提高整体吞吐量,以及增加对向量应用编程接口(API)的支持,从而更轻松地构建涉及人工智能 AI 模型的 Java 应用。java 21官方下载地址:https://www.oracle.com/de/java/technologies/downloads/
字符串模板
在Java 21中处理字符串的新方法称为:Template Expressions,即:模版表达式。
主要包含三个部分:
- 模版处理器:
STR
- 包含内嵌表达式(
\{blog}
)的模版 - 通过
.
把前面两部分组合起来,形式上类似方法调用
示例场景:
- 内嵌表达式中可以进行数学运算。
- 内嵌表达式中还可以调用方法。
- 内嵌表达式中还可以访问对象的成员变量。
//模板表达式演示
public void testTemplateExpressions(){
String blog = "cnblogs.com/caohuajin";
String str = STR."My blog is \{blog}";//调用字符串模板
int x = 10;
int y = 20;
String result = STR."\{x} + \{y} = \{x + y}";//内嵌表达式数学运算
String s = STR."My blog is \{getMyBlog()}";//调用getMyBlog方法
User2 u = new User2("Mr.cao", "cnblogs.com/caohuajin"); // 构造函数参数为name属性和blog属性
String user = STR."\{u.name}的博客地地址为:+ \{u.blog}";
System.out.println(user);
}
public String getMyBlog(){
return "cnblogs.com/caohuajin";
}
@Data
public class User{
String name;
String blog;
public User(String name, String blog){
this.name = name;
this.blog = blog;
}
}
记录模式
以前我们定义类都是用class
关键词,但从Java 16开始,我们将多一个关键词record
,它也可以用来定义类。record
关键词的引入,主要是为了提供一种更为简洁、紧凑的final
类的定义方式。替代lombok插件(Lombok并非Java官方提供),record
类可以根据类的字段自动生成:构造函数、equals()、hashCode() 和 toString()。
record
申明的类为了简化类的声明,具备这些特点:
- 它是一个
final
类 - 自动实现
equals
、hashCode
、toString
函数 - 成员变量均为
public
属性
//record记录类
public void testRange(){
range r = new range(10, 20);
System.out.println(r.distance());
}
record range(int start, int end){
int distance(){
return end - start;
}
}
有序集合
Sequenced Collectionsopen 引入了三个新接口:
- SequencedCollection
- SequencedMap
- SequencedSet
对于List
, Set
这些有序的集合,访问方法变得统一起来:
- 第一个元素:
collection.getFirst()
- 最后一个元素:
collection.getLast()
//有序集合
public void testSortedSet(){
ArrayList collection = new ArrayList();
collection.getFirst();
SortedSet sortedSet = new TreeSet();
sortedSet.getFirst();
}
switch模式匹配
简化Switch配置
- java 16中的instance of增强。对于
instanceof
的判断以及类型转换可以合二为一
Object value = data.get("key1");
if (value instanceof String s) {
System.out.println(s.substring(1));
}
- switch中使用Lambda的增强。
//switch匹配简化
public void testSwitch() {
Map<String, Object> data = new HashMap<>();
data.put("key1", "value1");
data.put("key1", 12.67);
// data.put("key1", 56);
switch (data.get("key1")) {
//instance of增强和switch中使用Lambda的增强
case String s -> System.out.println(s);
case Double d -> System.out.println(d.toString());
case Integer i -> System.out.println(i.toString());
default -> System.out.println("default");
}
}
虚拟线程
虚拟线程是一个新的轻量级 java.lang.Thread 变体,是 Project Loom 项目的一部分,不由操作系统管理或调度。相反由 JVM 负责调度。当然在实际工作反映到操作系统还是以平台线程运行,但 JVM 正是利用所谓的载体线程(即平台线程)来“承载”虚拟线程。
- 虚拟线程是由JVM管理的轻量级线程。
- 虚拟线程不需要任何显式分配或调度。
- 虚拟线程非常适合I/O密集型任务或需要大量并行性的任务。
- 虚拟线程也可以用来实现异步操作。
//虚拟线程
public void testVirtualThread() {
Runnable runnable = () -> {
System.out.println("你好, 虚拟线程!");
System.out.println(Thread.currentThread().getName());
};
// 使用静态构建器方法
Thread virtualThread = Thread.startVirtualThread(runnable);
// 使用静态工厂方法
ThreadFactory virtualThreadFactory = Thread.ofVirtual()
.name("myVirtual", 0)
.factory();
Thread factoryThread = virtualThreadFactory.newThread(runnable);
factoryThread.start();
// 结合ExecutorService方式
try (ExecutorService executorService = Executors.newVirtualThreadPerTaskExecutor()) {
for (int i = 1; i < 100; i++) {
executorService.submit(runnable);
}
}
}
StringBuilder和StringBuffer新增repeat方法
//StringBuilder和StringBuffer的repeat方法演示
public void testStringBuilder() {
var sb = new StringBuilder().repeat("*", 10);
System.out.println(sb);
}
main方法简化
public class Main {
void main() { //main方法简化
Main main = new Main();
main.testTemplateExpressions();
main.testRange();
main.testSwitch();
main.testVirtualThread();
main.testStringBuilder();
}
.......
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· 【全网最全教程】使用最强DeepSeekR1+联网的火山引擎,没有生成长度限制,DeepSeek本体