Java21中的新特性之一便是引入了Sequenced Collections(顺序集合)。这一特性通过JEP 431引入,旨在提供一种有序的、线程安全的集合实现,以满足在多线程环境下处理大量数据的需求。

背景与动机

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

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

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

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

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

Sequenced Collections的定义与特性

Sequenced Collections是一种新的集合类型,它提供了一个统一的接口来表示具有定义好的出现顺序的集合。每个Sequenced Collection都有一个明确定义的第一个元素、第二个元素,依此类推,直到最后一个元素。它还提供了一套统一的API来访问集合的第一个和最后一个元素,并以相同的顺序处理集合中的元素。

具体来说,Sequenced Collections具有以下特性:

  • 有序性:每个Sequenced Collection都保持元素插入的顺序。
  • 线程安全性:Sequenced Collections提供了线程安全的集合实现,可以在多线程环境下安全地访问和修改集合中的数据。这是通过一种称为“Sequenced Locks”的特殊锁机制实现的,它允许多个线程同时读取集合中的数据,但只允许一个线程进行写操作。
  • 可扩展性:Sequenced Collections的设计考虑了可扩展性,可以处理大量数据的并发访问。

主要接口与方法

Java 21为Sequenced Collections引入了三个主要的接口:

  • SequencedCollection:这是表示具有定义好的出现顺序的集合的基础接口。它继承了Collection接口,并添加了一系列与顺序相关的方法,如reversed()、addFirst(E)、addLast(E)、getFirst()、getLast()和removeFirst()等。
  • SequencedSet:这是Set接口的扩展,表示有序且不包含重复元素的集合。它继承了Set和SequencedCollection接口,并提供了reversed()方法以返回一个反转顺序的SequencedSet。
  • SequencedMap<K,V>:这是Map接口的扩展,表示条目具有定义好的遍历顺序的映射。它继承了Map接口,并添加了一系列与顺序相关的方法,如reversed()、sequencedKeySet()、sequencedValues()、sequencedEntrySet()、putFirst(K, V)、putLast(K, V)、firstEntry()、lastEntry()、pollFirstEntry()和pollLastEntry()等。

【java21】java21新特性之顺序集合_顺序集合


【java21】java21新特性之顺序集合_java21_02

顺序集合的使用

以下是一个使用Sequenced Collections的简单示例:

package com.morris.java21;

import java.util.LinkedHashMap;
import java.util.SequencedMap;

/**
 * 顺序集合的使用
 */
public class SequencedCollectionsDemo {

    public static void main(String[] args) {
        SequencedMap<Integer, String> map = new LinkedHashMap<>();
        // 添加元素
        map.put(1, "Apple");
        map.put(2, "Banana");
        map.put(3, "Orange");
        // 获取元素
        String fruit = map.get(2);
        System.out.println(fruit); // 输出: Banana
        // 遍历元素
        map.forEach((key, value) -> System.out.println(key + ": " + value));
        // 输出:
        // 1: Apple
        // 2: Banana
        // 3: Orange
    }
}

在这个示例中,我们使用了SequencedHashMap来创建一个有序的集合,并展示了如何添加、获取和遍历集合中的元素。

Sequenced Collections的引入对Java集合框架产生了深远的影响。首先,它提供了一个统一的接口来表示具有定义好的出现顺序的集合,使得在API中表达某些有用概念变得更加容易。其次,它提供了一套统一的与顺序相关的操作集,使得不同类型的集合在处理顺序相关操作时方式更加一致。最后,它提供了线程安全的集合实现,满足了在多线程环境下处理大量数据的需求。