【Java 21 新特性 】顺序集合(Sequenced Collections)

Java21引入了SequencedCollection接口,以统一描述具有确定出现顺序的集合,包括SequencedSet和SequencedMap子接口,提供如reversed(),addFirst(),addLast()等操作,解决了集合顺序操作分散的问题,优化了List,Deque,LinkedHashSet,SortedSet,LinkedHashMap和SortedMap等集合类的层次结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java 21 中增加了一种新的集合类型:顺序集合(Sequenced Collections)。

要介绍顺序集合,就首先要说明一下出现顺序(encounter order)。出现顺序指的是在遍历一个集合时,集合中元素的出现顺序。

有些集合类型,有确定的出现顺序,比如 List。不管遍历多少次这样的集合,其中元素的出现顺序始终是固定。

有些集合类型,并没有确定的出现顺序,比如 HashSet。如果多次遍历这样的集合,其中元素的出现顺序是不固定的。

在顺序集合出现之前,Java 并没有一个统一的接口来描述具有确定出现顺序的集合。比如 Set 接口虽然没有确定的出现顺序,但是它的子类型 LinkedHashSet 和 SortedSet 是有的。

另外一个问题是,对于有固定出现顺序的集合,并没有定义统一的与顺序相关的操作。与顺序集合的处理相关的方法,散落在 Java 集合类库的不同地方。这些方法并没有统一的声明,使用起来也不方便。

与顺序集合相关的操作包括:

  • 获取集合的第一个和最后一个元素

  • 在集合的最前面和最后面插入或删除元素

  • 按照逆序来遍历集合


Java 21 的顺序集合会解决这些问题。增加了 3 个新的接口。

首先是 SequencedCollection,该接口的声明如下所示:

interface SequencedCollection<E> extends Collection<E> {
    SequencedCollection<E> reversed();
    void addFirst(E);
    void addLast(E);
    E getFirst();
    E getLast();
    E removeFirst();
    E removeLast();
}

SequencedCollection 继承自 Collection

在包含的方法中:

  • reversed 方法返回一个逆序的 SequencedCollection 对象。

  • addFirst 和 addLast 方法分别在集合的起始和结束位置添加新的元素。

  • getFirst 和 getLast 方法分别获取集合的第一个和最后一个元素。

  • removeFirst 和 removeLast 方法分别删除集合的第一个和最后一个元素。

除了 SequencedCollection 之外,还有几个具体的子类型:

SequencedSet 同时继承自 Set 和 SequencedCollection

interface SequencedSet<E> extends Set<E>, SequencedCollection<E> {
    SequencedSet<E> reversed();    
}

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。

添加了这3个新的接口之后,Java 集合类的层次结构发生了变化,如下图所示:

b1e133285b0e77ec6541aa8cac2555f6.png

绿色方框是新增的 3 个接口,从中可以看到已有集合类的继承关系的变化:

  • List 继承自 SequencedCollection

  • Deque 继承自 SequencedCollection

  • LinkedHashSet 实现了 SequencedSet 接口。

  • SortedSet 继承自 SequencedSet

  • LinkedHashMap 实现了 SequencedMap 接口。

  • SortedMap 继承自 SequencedMap

有了这3个新的顺序集合相关的接口之后,Java 代码可以更清楚地表达顺序集合以及顺序集合上的操作。

<think>好的,我需要回答用户关于JDK 17和JDK 21之间主要区别和功能变更的问题。首先,我要确保自己了解这两个版本的更新内容,特别是JDK 21作为最新的LTS版本有哪些新特性。 首先,我应该回顾JDK 17的主要特性。我记得JDK 17引入了密封类、模式匹配的增强,以及移除了一些过时的功能,比如Applet API。这些都是Java长期演进的一部分,旨在提高语言的表达能力和安全性。 接下来是JDK 21。根据参考资料[^1],JDK 21是另一个LTS版本,包含了多项重要更新。其中,虚拟线程(Virtual Threads)是一个重大特性,属于Project Loom的一部分,旨在简化并发编程。此外,结构化并发和记录模式的引入也是关键点。还有字符串模板、分代ZGC等改进。 需要注意用户提到的引用[^2]中的GLIBC版本问题,这可能涉及JDK 21对系统库的依赖变化,但用户主要询问的是功能差异,所以这部分可能作为兼容性注意事项提及,但不是功能差异的核心内容。 需要确保回答结构清晰,分点列出主要差异。可能需要分为语言特性、API更新、性能改进、JVM增强等部分。同时,按照用户要求,每个引用末尾添加引用标识,例如[^1]。 还要检查是否有遗漏的重要特性,比如JDK 21中的其他预览功能或废弃的功能。例如,分代ZGC在JDK 21中作为生产特性,而之前版本可能还在实验阶段。此外,模式匹配的增强可能包括switch表达式的进一步改进。 需要确认各个特性的归属版本是否正确,比如虚拟线程是在JDK 19引入为预览,JDK 21中成为正式功能吗?或者是在JDK 21中作为正式特性?需要核实。根据最新的信息,虚拟线程在JDK 21中作为正式功能发布,而结构化并发可能还在孵化阶段或成为预览特性。 同时,要确保使用正确的中文术语,比如“虚拟线程”而非“协程”。此外,记录模式(Record Patterns)是在模式匹配中的一部分,允许解构记录类型。 可能还需要提到其他改进,比如向量API的进展,或者对Project Valhalla的值的对象的支持,但需要确认是否在JDK 21中实际存在。如果这些特性尚未发布,可能不需要提及。 最后,生成相关问题,考虑用户可能感兴趣的后续问题,比如迁移注意事项、性能对比、特定特性的使用方法等。 需要确保回答符合用户给出的格式要求:使用中文,行内公式用$...$,独立公式用$$...$$,但在这个问题中可能不需要数学公式,但需要正确应用引用标记。例如,在提到JDK 21新特性时,引用[^1]。 总结步骤: 1. 概述JDK 17和JDK 21的版本性质(LTS)。 2. 分点对比语言特性、API变化、性能优化、JVM改进等。 3. 注意引用标记的正确添加。 4. 生成相关问题。</think>### JDK 17 vs JDK 21 功能差异与版本更新内容 #### 1. **版本性质与支持周期** - **JDK 17**(2021年发布)是长期支持版本(LTS),提供长期维护更新至2029年[^1]。 - **JDK 21**(2023年发布)同样是LTS版本,支持周期更长,适合企业级应用[^1]。 #### 2. **核心语言特性** - **JDK 17**: - **密封类(Sealed Classes)**:限制类或接口的子类范围,增强代码安全性。 - **模式匹配增强**:支持`instanceof`模式匹配和`switch`表达式类型匹配。 - **移除过时功能**:如Applet API、Security Manager标记为废弃。 - **JDK 21**: - **虚拟线程(Virtual Threads)**:轻量级线程模型(正式功能),显著提升并发性能[^1]。 - **记录模式(Record Patterns)**:支持解构记录类型,简化数据操作。 - **字符串模板(预览)**:通过`STR`模板处理器实现字符串插值,例如: ```java String name = "Java"; String message = STR."Hello \{name}!"; ``` - **结构化并发(预览)**:通过`StructuredTaskScope`管理多线程任务生命周期[^1]。 #### 3. **API 更新** - **JDK 21**引入新API: - **分代式ZGC**:将堆内存分代管理,减少垃圾回收停顿时间(生产环境可用)。 - **序列集合Sequenced Collections)**:为集合定义一致的访问顺序接口,如`getFirst()`、`getLast()`。 #### 4. **性能与 JVM 改进** - **JDK 21**优化: - **ZGC 分代模式**:降低内存占用,提升吞吐量。 - **G1 垃圾回收器**:改进并行处理能力。 - **Linux/RISC-V 支持**:适配新兴硬件架构[^1]。 #### 5. **兼容性与依赖变更** - **JDK 21**要求更高的系统依赖,例如部分Linux系统需GLIBC 2.17+,否则可能报错`GLIBC_2.14 not found`[^2]。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值