💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
- 推荐:kuan 的首页,持续学习,不断总结,共同进步,活到老学到老
- 导航
非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨
博客目录
1.介绍
JDK 21 已经于 2023 年 9 月 19 日正式发布。本文总结了 JDK 21 发布的新特性。
根据发布的规划,这次发布的 JDK 21 将是一个长期支持版(LTS 版)。LTS 版每 2 年发布一个,上一次长期支持版是 21 年 9 月发布的 JDK 17。不能抱有你强任你强,我用 java8 的思想。
2.版本
主要分为 OpenJDK 版本和 Oracle 版本,下载地址如下:
- OpenJDK 版本:https://jdk.java.net/21/
- Oracle 版本:https://www.oracle.com/java/technologies/downloads/
3.JDK21 新特性
- 序列集合
- 分代 ZGC
- 记录模式
- switch 模式匹配
- 虚拟线程
- 弃用 Windows 32 位 x86 移植
- 不允许动态加载代理
- 密钥封装机制
4.安装 jdk21
5.虚拟线程
将虚拟线程(Virtual Threads)引入 Java 平台。虚拟线程是轻量级线程,可以显著减少编写、维护和观察高吞吐量并发应用程序的工作量。
- 轻量级线程管理:虚拟线程不需要底层操作系统线程的支持,因此可以创建数千甚至数万个虚拟线程而不会消耗大量的内存和资源。这使得应用程序可以更高效地管理大量并发任务。
- 更快的线程创建和销毁:传统的 Java 线程创建和销毁通常涉及昂贵的操作系统调用,而虚拟线程的创建和销毁成本更低,因此可以更快速地启动和停止线程。
- 更好的资源利用:由于虚拟线程可以更轻松地伸缩,因此它们有助于更好地利用现有的系统资源,以处理大规模的并发请求。
- 避免死锁和资源争夺:虚拟线程的管理方式可以减少线程之间的竞争和资源争夺,从而降低了死锁和性能问题的风险。
- 简化并发编程:虚拟线程的引入使得编写并发程序变得更加容易,开发人员可以专注于业务逻辑而不必过多关注线程管理和同步。
public class Test01 { public static void main(String[] args) { try (var executor = Executors.newVirtualThreadPerTaskExecutor()) { IntStream.range(0, 10000).forEach(i -> executor.submit(() -> { Thread.sleep(Duration.ofSeconds(1)); return i; })); } }}
6.有序集合
在 JDK 21 中,Sequenced Collections 的引入带来了新的接口和方法来简化集合处理。此增强功能旨在解决访问 Java 中各种集合类型的第一个和最后一个元素需要非统一且麻烦处理场景。
Sequenced Collections 引入了三个新接口:
- SequencedCollection
- SequencedMap
- SequencedSet
绿色方框是新增的 3 个接口,从中可以看到已有集合类的继承关系的变化:
-
List 继承自 SequencedCollection。
-
Deque 继承自 SequencedCollection。
-
LinkedHashSet 实现了 SequencedSet 接口。
-
SortedSet 继承自 SequencedSet。
-
LinkedHashMap 实现了 SequencedMap 接口。
-
SortedMap 继承自 SequencedMap。
有了这 3 个新的顺序集合相关的接口之后,Java 代码可以更清楚地表达顺序集合以及顺序集合上的操作。
这些接口附带了一些新方法,以提供改进的集合访问和操作功能。
public class Test02 { public static void main(String[] args) { SequencedCollection<Integer> arr = new ArrayList<>(); arr.addLast(1); arr.addLast(2); arr.addLast(3); arr.addLast(31); arr.addFirst(14); System.out.println(arr); }}
第一个和最后一个元素的访问:
在 JDK 21 之前,检索 Java 中集合的第一个和最后一个元素涉及不同的方法和途径,具体取决于集合类型。
下面让我们看一下使用 JDK 21 之前的 JDK API 调用访问第一个和最后一个元素的一些示例:
访问位置 | List | Deque | SortedSet |
---|---|---|---|
第一个元素 | list.get(0) | deque.getFirst() | set.first() |
最后一个元素 | list.get(list.size()-1) | deque.getLast() | set.last() |
可以看到,一个简单的操作,在不同的集合中需要不同的编写方式,非常麻烦!
但在 JDK 21 之后,访问第一个和最后一个元素就方法多了:
对于List
, Deque
, Set
这些有序的集合,访问方法变得统一起来:
- 第一个元素:
collection.getFirst()
- 最后一个元素:
collection.getLast()
首先是 SequencedCollection
,该接口的声明如下所示:SequencedCollection
继承自 Collection
。
interface SequencedCollection<E> extends Collection<E> { SequencedCollection<E> reversed(); void addFirst(E); void addLast(E); E getFirst(); E getLast(); E removeFirst(); E removeLast();}
在包含的方法中:
-
reversed 方法返回一个逆序的 SequencedCollection 对象。
-
addFirst 和 addLast 方法分别在集合的起始和结束位置添加新的元素。
-
getFirst 和 getLast 方法分别获取集合的第一个和最后一个元素。
-
removeFirst 和 removeLast 方法分别删除集合的第一个和最后一个元素。
SequencedSet
interface SequencedSet extends Set, SequencedCollection { SequencedSet reversed();}
SequencedMap
SequencedMap
继承自 Map
,其中的 entry 有确定的出现顺序。
SequencedMap
中的方法比较多,如下所示:
interface SequencedMap<K,V> extends Map<K,V> { SequencedMap<K,V> reversed(); SequencedSet<K> sequencedKeySet(); SequencedCollection<V> sequencedValues(); SequencedSet<Entry<K,V>> sequencedEntrySet(); V putFirst(K, V); V putLast(K, V); Entry<K, V> firstEntry(); Entry<K, V> lastEntry(); Entry<K, V> pollFirstEntry(); Entry<K, V> pollLastEntry();}
具体的方法说明:
-
reversed 方法返回一个 entry 逆序的 SequencedMap。
-
sequencedKeySet 方法返回包含 key 的 SequencedSet。
-
sequencedValues 方法返回包含 value 的 SequencedCollection。
-
sequencedEntrySet 方法返回包含 entry 的 SequencedSet。
-
putFirst 和 putLast 分别在 entry 的最前和最后位置插入名值对。
-
firstEntry 和 lastEntry 分别获取第一个和最后一个 entry。
-
pollFirstEntry 和 pollLastEntry 分别删除第一个和最后一个 entry。
7.记录模式
使用记录模式(Record Patterns)增强 Java 编程语言,以解构记录值。可以嵌套记录模式和类型模式,以实现功能强大、声明性和可组合形式的数据导航和处理。
public record Test03(int x, int y) {}
static void print(Object o) { if (o instanceof Test03(int x, int y)) { System.out.println(x + y); }}
8.switch 模式匹配
通过 switch 表达式和语句的模式匹配来增强 Java 编程语言。通过将模式匹配扩展到 switch,可以针对多个模式测试表达式,每个模式都有一个特定的操作,从而可以简洁、安全地表达复杂的面向数据的查询。
public class Test04 { public static void main(String[] args) { Object obj = "你好"; Object a = switch (obj) { case Integer i -> String.format("int %d", i); case String s -> String.format("string %s", s); case Double d -> String.format("Double %s", d); default -> obj.toString(); }; System.out.println(a); }}
觉得有用的话点个赞
👍🏻
呗。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍
🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙
来源地址:https://blog.csdn.net/qyj19920704/article/details/133297170