Java 21 中增加了一种新的集合类型:顺序集合(Sequenced Collections)。
要介绍顺序集合,就首先要说明一下出现顺序(encounter order)。出现顺序指的是在遍历一个集合时,集合中元素的出现顺序。
有些集合类型,有确定的出现顺序,比如 List
。不管遍历多少次这样的集合,其中元素的出现顺序始终是固定。
有些集合类型,并没有确定的出现顺序,比如 HashSet
。如果多次遍历这样的集合,其中元素的出现顺序是不固定的。
在顺序集合出现之前,Java 并没有一个统一的接口来描述具有确定出现顺序的集合。比如 Set
接口虽然没有确定的出现顺序,但是它的子类型 LinkedHashSet
和 SortedSet
是有的。
另外一个问题是,对于有固定出现顺序的集合,并没有定义统一的与顺序相关的操作。与顺序集合的处理相关的方法,散落在 Java 集合类库的不同地方。这些方法并没有统一的声明,使用起来也不方便。
与顺序集合相关的操作包括:
获取集合的第一个和最后一个元素
在集合的最前面和最后面插入或删除元素
按照逆序来遍历集合
Java 21 的顺序集合会解决这些问题。增加了 3 个新的接口。
首先是 SequencedCollection
,该接口的声明如下所示:
interface SequencedCollection extends Collection {
SequencedCollection 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 extends Set, SequencedCollection {
SequencedSet reversed();
}
SequencedMap
继承自 Map
,其中的 entry 有确定的出现顺序。
SequencedMap
中的方法比较多,如下所示:
interface SequencedMap extends Map {
SequencedMap reversed();
SequencedSet sequencedKeySet();
SequencedCollection sequencedValues();
SequencedSet> sequencedEntrySet();
V putFirst(K, V);
V putLast(K, V);
Entry firstEntry();
Entry lastEntry();
Entry pollFirstEntry();
Entry pollLastEntry();
}
具体的方法说明:
reversed
方法返回一个 entry 逆序的 SequencedMap
。
sequencedKeySet
方法返回包含 key 的 SequencedSet
。
sequencedValues
方法返回包含 value 的 SequencedCollection
。
sequencedEntrySet
方法返回包含 entry 的 SequencedSet
。
putFirst
和 putLast
分别在 entry 的最前和最后位置插入名值对。
firstEntry
和 lastEntry
分别获取第一个和最后一个 entry。
pollFirstEntry
和 pollLastEntry
分别删除第一个和最后一个 entry。
添加了这3个新的接口之后,Java 集合类的层次结构发生了变化,如下图所示:
绿色方框是新增的 3 个接口,从中可以看到已有集合类的继承关系的变化:
List
继承自 SequencedCollection
。
Deque
继承自 SequencedCollection
。
LinkedHashSet
实现了 SequencedSet
接口。
SortedSet
继承自 SequencedSet
。
LinkedHashMap
实现了 SequencedMap
接口。
SortedMap
继承自 SequencedMap
。
有了这3个新的顺序集合相关的接口之后,Java 代码可以更清楚地表达顺序集合以及顺序集合上的操作。