求求你们别学了,已经追不上了,JDK21已经发布了

news2024/11/23 16:18:07

目录

    • 引言
    • 特性介绍
    • 2.1 字符串模版(预览版)
      • 2.1.1 在 Java 21 字符串拼接
      • 2.1.2 JDK 21 字符串模板
    • 2.2 顺序集合*
      • 2.2.1 SequencedCollection 接口
      • 2.2.2 SequencedSet 和 SequencedMap 类
    • 2.3 switch语句的改进
    • 2.4 Lambda表达式的新特性
    • 2.5 Structural Pattern Matching(结构化模式匹配)
    • 2.6 Record(记录)类型的改进
    • 2.7 VarHandle的增强**
    • 2.8 其他新特性
    • 小结

引言

JDK21他来了,于2023年9月19日正式发布。官方传送门有兴趣的同学可以自行查看。

在这里插入图片描述

特性介绍

2.1 字符串模版(预览版)

  字符串模板(String Templates)的功能,它提供了一种更简洁、更灵活的方式来构建字符串。字符串模板允许在字符串中插入表达式或变量,并在运行时进行求值。通过字符串模版我们代码可读性更强。接下来介绍一下字符串在 JDK 21 以前和之后字符串处理方式。

2.1.1 在 Java 21 字符串拼接

通常通过如下方式

  1. +号运算符进行拼接这中方式使得代码不容易阅读。
  2. 通过 String::format 或者 String::formatted。
  3. java.text.MessageFormat。

2.1.2 JDK 21 字符串模板

  1. 字符串插值新的字符串插值语法允许在字符串中嵌入表达式,使用${expression}的形式。这样可以更方便地将变量或表达式的值嵌入到字符串中,而无需使用字符串连接操作符。例如:
String name = "John";
int age = 25;
String message = STR."My name is ${name} and I am ${age} years >old.";
System.out.println(message); 

        输出结果为:My name is John and I am 25 years old.

  1. 多行模板表达式新的多行模板表达式语法允许在字符串模板中跨多行编写文本。使用三个双引号( “”")将多行文本括起来,可以更清晰地表示多行文本的结构。例如:
String title = "My Web Page";
String text = "Hello, world";
String html = STR."""<html><head><title>\{title}</title></head><body><p>\{text}</p></body></html>""";

        输出结果为:
        Hello, world

  1. 字符串模板中使用嵌入的表达式进行计算和自增操作int index = 0;
    String data = STR.“{index++}, {index++}, {index++}, {index++}”;
    输出结果:“0, 1, 2, 3”
  2. 字符串模板中使用嵌入的表达式来访问数组元素。
    String[] fruit = { “apples”, “oranges”, “peaches” };
    String s = STR.“{fruit[0]}, {STR.”{fruit[1]}, {fruit[2]}“}”;输出结果:“apples, oranges, peaches”
    到这里字符串模版常用场景介绍完毕,更多详细介绍请参看:https://openjdk.org/jeps/430

  需要注意的是,字符串模板为预览版 API,这意味着它仍处于开发和改进阶段。预览 API可能会在未来的版本中发生变化,因此在生产环境中使用时需要谨慎。

2.2 顺序集合*

  针对元素在集合中具有具体的位次的顺序集合例如:ArrayList、LinkedHashSet、LinkedHashMap 等 。JDK 21 新增了三个接口:SequencedCollection、SequencedSet SequencedMap;
并且为这三个接口提供了一些默认实现类,比如 ArrayList、LinkedList 等。这些接口和类提供了更好的对集合中元素顺序的处理。

2.2.1 SequencedCollection 接口

  SequencedCollection 接口继承了 Collection 接口,它主要有两个特性:

  1. 它拥有一个可以用来获取指定索引处的元素的顺序访问迭代器(即位置参数化),同时,它的所有子类也拥有该特性。
  2. 它的子类(如 ArrayList 和 LinkedList)中的元素可以通过使用其方法(如 add 和 get)进行访问、删除等操作。

SequencedCollection 接口中定义了一些方法,比如:

  • get(int index): 返回指定索引处的元素。
  • indexOf(Object o): 返回第一个匹配到的指定元素的索引,如果未找到则返回-1。
  • lastIndexOf(Object o): 返回最后一个匹配到的指定元素的索引,如果未找到则返回-1。
  • remove(int index): 移除指定索引处的元素。
  • contains(Object o): 如果集合中包含指定的元素,则返回 true。
  • isEmpty(): 如果集合中没有任何元素,则返回 true。

2.2.2 SequencedSet 和 SequencedMap 类

  除了 SequencedCollection 接口之外,JDK 21 还新增了两个类:SequencedSet 和 SequencedMap。它们分别继承了 HashSet 和 HashMap,并增加了相应的接口方法。SequencedSet 中新增的方法有:

  • add(E e): 将指定的元素添加到集合中(可选操作)。
  • remove(Object o): 从集合中移除指定的元素(可选操作)。
  • contains(Object o): 如果集合中包含指定的元素,则返回 true。
  • isEmpty(): 如果集合中没有任何元素,则返回 true。
  • iterator(): 返回一个迭代器,它可以按照集合元素的插入顺序来访问集合中的所有元素。

SequencedMap 中新增的方法有:

  • put(K key, V value): 将指定的值与此映射中的指定键相关联(可选操作)。
  • remove(Object key): 从映射中移除指定键及其关联值(可选操作)。
  • get(Object key): 返回指定键关联的值,如果映射中没有这样的项则返回 null。
  • isEmpty(): 如果映射中没有任何键值对,则返回 true。
  • keySet(): 返回一个 set,它包含了映射中的所有键。
  • values(): 返回一个 collection,它包含了映射中的所有值。

2.3 switch语句的改进

  在Java 12中,引入了一个新的switch表达式,它可以更方便地处理null值。这个新的switch表达式被称为"switch增强"。它的基本语法如下:

switch (expression) {
 case value1 -> result1;
 case value2 -> result2;
 case value3 -> result3;
 ...
 default -> defaultResult;
}

这种新的switch语法可以处理null值,如果某个case的值是null,它不会抛出NullPointerException。相反,它会执行相应的结果部分,然后从switch语句中返回。如果没有一个case匹配,那么会执行default部分(如果存在的话)。

2.4 Lambda表达式的新特性

  Lambda表达式在Java 11中引入,它是一种简洁的表示匿名函数的方法。在Java 21中,Lambda表达式得到了进一步的改进,允许使用预览语言特性var。
在Lambda表达式中,类型推断是一个重要的概念。使用var可以大大简化Lambda表达式的类型声明。例如:

Function<String, Integer> strLength = (String s) -> s.length();

可以被简化为:

Function<String, Integer> strLength = var s -> s.length();

需要注意的是,var不能用于Lambda表达式的返回类型。例如,下面的代码将产生编译错误:

Function<String, var Integer> strLength = (String s) -> 3; //编译错误

2.5 Structural Pattern Matching(结构化模式匹配)

  Java 19引入了JEP 406:Structural Pattern Matching(结构化模式匹配)。这种新的匹配方式可以使用“下画线”忽略模式进行匹配。在之前的版本中,使用一个变量名代表要匹配的模式。在结构化模式匹配中,可以使用下画线“_”来表示忽略某个变量。例如:

if (point != null && _ + _ > 0) { ... } // (x, y) point's coordinates

在这个例子中,第二个“_”表示我们不关心y的值,只关心x的值。只要点不为null,且x + y > 0,那么这个条件就成立。这种写法使得代码更加简洁明了。

2.6 Record(记录)类型的改进

  Java 14引入了Record类型,这是一种新的数据封装类型,可以更简洁地表达数据不变的语义。在Java 21中,对Record类型做了一些改进:

  1. 默认的toString、equals、hashCode和compareTo方法变得更加合理。比如,toString方法会按照字段的顺序输出字段名和字段值,hashCode方法会根据字段的hashCode计算Record的hashCode。
  2. Record的字段现在可以通过名称进行访问和设置。之前,只能通过位置进行访问和设置,现在可以通过名称进行访问和设置,更加方便。例如:
public record Person(String name, int age) {}
Person person = new Person("Tom", 20);
System.out.println(person.name); // Output: Tom
System.out.println(person.age); // Output: 20

2.7 VarHandle的增强**

  VarHandle是Java 9引入的一个用于操作内存的基本工具。在Java 21中,VarHandle得到了进一步的增强,增加了几个新的方法,可以更方便地操作内存。例如,
VarHandle.getAndBitwiseOrVarHandle.getAndBitwiseAndVarHandle.getAndBitwiseXor等方法可以用于对内存中的变量进行位操作。

2.8 其他新特性

  1. 新的时间日期API:Java 21引入了JEP 398:Temporal API,这个API提供了一套全新的时间日期API,可以更方便地处理时间和日期。
  2. 更好的集合支持:Java 21引入了JEP 406:Structural Pattern Matching(结构化模式匹配),可以在集合操作中更方便地使用模式匹配。
  3. 虚拟线程:Java 21引入了JEP 338:Virtual Threads,虚拟线程是一种轻量级的线程,可以提高多线程程序的编写和执行效率。
  4. 新的性能监控工具:Java 21引入了Java Mission Control(JMC),这是一个新的性能监控工具,可以更详细地了解Java应用的性能情况。

小结

  总之新特性还是非常多,但是目前还是以学习了解为主,暂时不建议尝鲜使用在生产环境。
点赞收藏,富婆包养✋✋

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

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

相关文章

Java 华为真题-新员工座位安排

需求&#xff1a; 工位由序列F1,F2…Fn组成&#xff0c;Fi值为0、1或2。其中0代表空置&#xff0c;1代表有人&#xff0c;2代表障碍物. 1、某一空位的友好度为左右连续老员工数之和 2、为方便新员工学习求助&#xff0c;优先安排友好度高的空位给出工位序列&#xff0c;求所…

Python入门之【循环语句】全网最详细!

&#x1f3c5;我是默&#xff0c;这是我的个人主页。&#x1f4da;&#x1f4da; &#x1f31f;在这里&#xff0c;我要推荐给大家我的专栏《Python》。&#x1f3af;&#x1f3af; &#x1f680;无论你是编程小白&#xff0c;还是有一定基础的程序员&#xff0c;这个专栏都能满…

用智能文字识别技术赋能古彝文数字化之路

目录 1、前言 2、对古彝文古籍的保护迫在眉睫 3、古彝文识别的难点问题 4、古彝文文字识别的关键技术 4.1、智能高清滤镜技术 4.2、图像矫正 4.3、图像增强 4.4、版面还原 5、合合信息识别技术赋能古彝文数字化 1、前言 古彝文指的是在云南、贵州、四川等地的彝族人之…

一款免费的响应式界面调试工具

不知道大家平时开发响应式前端代码是如何调试的&#xff1f;是不是也跟我一样&#xff0c;通过浏览器的开发者工具来切换不同的界面尺寸来看验证效果呢&#xff1f; 可能是因为习惯了&#xff0c;平时就不停的切换不同尺寸来看效果。直到TJ君看到今天要推荐的这个免费工具&…

产品经理如何科学的进行需求调研?

导语&#xff1a;作为产品经理&#xff0c;需求调研是开展工作的重要环节之一。科学、有效地进行需求调研不仅可以帮助产品经理更好地了解用户需求&#xff0c;还能指导产品设计和功能开发&#xff0c;提升产品的竞争力。本文将介绍几种科学的方法和技巧&#xff0c;帮助产品经…

【linux基础】linux中文件权限的含义并修改

linux中文件权限的含义 前言文件类型字段访问权限字段如何修改访问权限基本语法&#xff1a;常用选项包括&#xff1a;数字形式权限模式&#xff1a;符号形式权限模式&#xff1a;示例用法&#xff1a; 总结 前言 在 Linux 中&#xff0c;文件的权限字段&#xff08;Permissio…

adjustText库解决深度学习、视觉模型matplotlib画散点图时由于标签非常多导致的重叠现象

pytorch框架 import matplotlib.pyplot as plt import numpy as np from adjustText import adjust_texty [30.48, 30.71, 30.52, 31.35, 31.53, 31.54, 31.82, 32.13, 32.21, 32.15, 31.92, 32.24, 32.21, 32.20, 32.35] x [0.057, 0.012, 0.025, 0.665, 1.774, 0.813, 0.55…

【面试必刷TOP101】寻找峰值 数组中的逆序对

目录 题目&#xff1a;寻找峰值_牛客题霸_牛客网 (nowcoder.com) 题目的接口&#xff1a; 解题思路&#xff1a; 代码&#xff1a; 过啦&#xff01;&#xff01;&#xff01; 题目&#xff1a;数组中的逆序对_牛客题霸_牛客网 (nowcoder.com) 题目的接口&#xff1a; …

Python二级 每周练习题20

练习一: 日期计算器 设计一款日期计算程序&#xff0c;能否实现下面的功能&#xff1a; (1)要求用户分别输入年、月、日&#xff08;分三次输入&#xff09;&#xff1b; (2)程序自动会根据输入的年月日计算出这一天是这一年的第几天&#xff1b; (3)输出格式为&#xff1a;这…

低功耗引擎Cliptrix为什么可以成为IOT的高效能工具

在万物互联的时代&#xff0c;现代人已普遍接受电视、音箱等电器设备具备智能化能力&#xff0c;也是在这个趋势下&#xff0c;我们身边越来越多的iOT设备联网和交互成为刚需。 但iot设备也面临到一些非常显著的痛点&#xff0c;例如iot设备的内存、处理器等核心元件无法与手机…

Selenium Web自动化测试 —— 高级控件交互方法!

一、使用场景 使用场景对应事件复制粘贴键盘事件拖动元素到某个位置鼠标事件鼠标悬停鼠标事件滚动到某个元素滚动事件使用触控笔点击触控笔事件&#xff08;了解即可&#xff09; https://www.selenium.dev/documentation/webdriver/actions_api 二、ActionChains解析 实例…

内网即时通讯软件:提升政企办公效率与数据安全的利器

在当今信息快速传播的社会中&#xff0c;即时通讯软件已经成为了人们生活中不可或缺的一部分。然而&#xff0c;对于政府机构和企业来说&#xff0c;传统的大众即时通讯软件已经不再满足他们日常工作的需求。市面上大多数个人即时通讯软件都是为大众用户设计的&#xff0c;它们…

【文末送书】用Chat GPT轻松玩转机器学习与深度学习

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。关…

PY32F003F18之RTC

一、RTC振荡器 PY32F003F18实时时钟的振荡器是内部RC振荡器&#xff0c;频率为32.768KHz。它也可以使用HSE时钟&#xff0c;不建议使用。HAL库提到LSE振荡器&#xff0c;但PY32F003F18实际上没有这个振荡器。 缺点&#xff1a;CPU掉电后&#xff0c;需要重新配置RTC&#xff…

Docker版部署RocketMQ开启ACL验证

一、拉取镜像 docker pull apache/rocketmq:latest 二、准备挂载目录 mkdir /usr/local/rocketmq/data mkdir /usr/local/rocketmq/conf 三、运行 docker run \ -d \ -p 9876:9876 \ -v /usr/local/rocketmq/data/logs:/home/rocketmq/logs \ -v /usr/local/rocketmq/data…

数字化工厂系统能给企业品牌带来什么价值

数字化工厂管理系统是指通过数字技术和自动化系统来实现生产过程的数字化和智能化的工厂。它对品牌的价值主要体现在提高效率、降低成本、提升品质和增强灵活性四个方面。 首先&#xff0c;数字化工厂能够显著提高生产效率。传统工厂生产过程中存在很多手工操作和人为干预&…

pyspark.sql.dataframe.DataFrame 怎么转pandas DataFrame

pyspark.sql.dataframe.DataFrame 怎么转pandas DataFrame 要将 PySpark 的 pyspark.sql.dataframe.DataFrame 转换为 Pandas DataFrame&#xff0c;可以使用 toPandas() 方法。以下是一个示例&#xff1a; from pyspark.sql import SparkSession# 创建 SparkSession 对象 sp…

SAP移动端解决方案参考

企业在实现SAP移动化时遇到的一些挑战&#xff0c;如果我们利用自己开发团队来进行应用程序的开发&#xff0c;可能会陷入规划&#xff0c;开发&#xff0c;调试&#xff0c;测试的循环中&#xff0c;最后仍一无所获。那如果企业寻找第三方咨询公司进行开发的话&#xff0c;又担…

分享5款无广告免费的高效软件

​ 有句老话这样讲&#xff0c;工欲善其事&#xff0c;必先利其器&#xff0c;好的工具可以让你工作起来事半功倍。今日为大家推荐5款神器软件&#xff0c;提升你的工作效率。 1.数据恢复——EasyRecovery ​ EasyRecovery是一款数据恢复工具,它可以恢复从硬盘或移动存储设备…

多个短视频如何合并为一个长视频?原来靠它

随着电子设备的流行&#xff0c;越来越多的用户喜欢制作视频来记录生活&#xff0c;以便将美好回忆永久保存方便日后观看。通常&#xff0c;人们更倾向于将多个短视频合并为一个长视频&#xff0c;因为这样更容易存储。那么&#xff0c;怎样才能将多个短视频合并为一个长视频呢…