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

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 代码可以更清楚地表达顺序集合以及顺序集合上的操作。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值