欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
- 推荐:kuan 的首页,持续学习,不断总结,共同进步,活到老学到老
- 导航
- 檀越剑指大厂系列:全面总结 java 核心技术点,如集合,jvm,并发编程 redis,kafka,Spring,微服务,Netty 等
- 常用开发工具系列:罗列常用的开发工具,如 IDEA,Mac,Alfred,electerm,Git,typora,apifox 等
- 数据库系列:详细总结了常用数据库 mysql 技术点,以及工作中遇到的 mysql 问题等
- 懒人运维系列:总结好用的命令,解放双手不香吗?能用一个命令完成绝不用两个操作
- 数据结构与算法系列:总结数据结构和算法,不同类型针对性训练,提升编程思维,剑指大厂
非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。 ✨✨ 欢迎订阅本专栏 ✨✨
JDK 21 已经于 2023 年 9 月 19 日正式发布。本文总结了 JDK 21 发布的新特性。
根据发布的规划,这次发布的 JDK 21 将是一个长期支持版(LTS 版)。LTS 版每 2 年发布一个,上一次长期支持版是 21 年 9 月发布的 JDK 17。不能抱有你强任你强,我用 java8 的思想。
主要分为 OpenJDK 版本和 Oracle 版本,下载地址如下:
将虚拟线程(Virtual Threads)引入 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;
}));
}
}
}
在 JDK 21 中,Sequenced Collections 的引入带来了新的接口和方法来简化集合处理。此增强功能旨在解决访问 Java 中各种集合类型的第一个和最后一个元素需要非统一且麻烦处理场景。
Sequenced Collections 引入了三个新接口:
绿色方框是新增的 3 个接口,从中可以看到已有集合类的继承关系的变化:
List 继承自 SequencedCollection。
Deque 继承自 SequencedCollection。
LinkedHashSet 实现了 SequencedSet 接口。
SortedSet 继承自 SequencedSet。
LinkedHashMap 实现了 SequencedMap 接口。
SortedMap 继承自 SequencedMap。
有了这 3 个新的顺序集合相关的接口之后,Java 代码可以更清楚地表达顺序集合以及顺序集合上的操作。
这些接口附带了一些新方法,以提供改进的集合访问和操作功能。
/**
* 序列集合
*
* @author : qinyingjie
* @version : 2.2.0
* @date : 2023/9/26 01:37
*/
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。
使用记录模式(Record Patterns)增强 Java 编程语言,以解构记录值。可以嵌套记录模式和类型模式,以实现功能强大、声明性和可组合形式的数据导航和处理。
/**
* 记录类
*
* @author : qinyingjie
* @date : 2023/9/26
*/
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);
}
}
通过 switch 表达式和语句的模式匹配来增强 Java 编程语言。通过将模式匹配扩展到 switch,可以针对多个模式测试表达式,每个模式都有一个特定的操作,从而可以简洁、安全地表达复杂的面向数据的查询。
/**
* switch模式匹配
*
* @author : qinyingjie
* @version : 2.2.0
* @date : 2023/9/26 01:37
*/
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 道阻且长,行则将至,让我们一起加油吧!