Java21新特性-顺序集合(JEP 431)
Java集合对于大家都非常熟悉,在实际开发中用的也是非常之广泛,比如ArrayList、HashMap、HashSet等等,而对于顺序集合,其实大家之前也都用过,比如ArrayList就是顺序集合,那Java21新增的一个新特性-顺序集合究竟是什么意思呢?我们一起来学习下。
1.介绍
顺序集合,英文称为“Sequenced Collections”,因此也有被翻译为“序列集合”或者“有序集合”。
Java 21引入了顺序集合这种新的集合类型,这是一种具有确定出现顺序的集合。在介绍顺序集合之前,我们需要先了解什么是出现顺序(encounter order)。
2.什么是集合出现顺序(encounter order)?
出现顺序是指遍历集合时,集合中元素出现的顺序。有些集合类型具有确定的出现顺序,例如ArrayList。无论我们遍历这样的集合多少次,元素的出现顺序始终是固定的。而有些集合类型并没有确定的出现顺序,例如HashSet。如果多次遍历这样的集合,元素的出现顺序是不固定的。可以简单理解为之前我们说的ArrayList是有序的,而HashSet是无序的。
3.为什么要新增顺序集合?
在顺序集合出现之前,Java并没有一个统一的接口来描述具有确定出现顺序的集合。虽然Set接口本身并没有确定的出现顺序,但它的子类型LinkedHashSet和SortedSet却具有。
另一个问题是,对于具有固定出现顺序的集合,Java并没有定义统一的与顺序相关的操作。与顺序集合相关的处理方法散落在Java集合类库的不同地方,使用起来并不方便。
现在,Java 21的顺序集合为我们提供了一个统一的接口来描述具有确定出现顺序的集合。这个接口定义了一些与顺序相关的操作,使得我们可以更方便地处理具有确定出现顺序的集合。
4.顺序集合相关的操作有哪些?
顺序集合的相关操作主要包括以下3个方面:
- 获取集合的第一个和最后一个元素
- 在集合的最前面和最后面插入或删除元素
- 按照逆序来遍历集合
这3个方面我们都可以从下面新增的接口中看到相关的抽象方法。
5.顺序集合新增的3个接口是什么?
Java21的顺序集合新增了3个接口,分别是:SequencedCollection、SequencedSet和SequencedMap。新增这3个接口后,集合的继承结构发生变化,如下所示:
其中绿色框就是新增的 3 个接口,从上图可以看到已有集合体系的继承关系发生的变化:
- List 继承了 SequencedCollection。
- Deque 继承了 SequencedCollection。
- LinkedHashSet 实现了 SequencedSet 接口。
- SortedSet 继承了 SequencedSet。
- SortedMap 继承了 SequencedMap。
- LinkedHashMap 实现了 SequencedMap 接口。
我们一起看下这3个接口。
5.1 SequencedCollection接口
SequencedCollection接口的具体源码定义如下:
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(): 删除集合的最后一个元素,并返回该元素。
5.2 SequencedSet接口
SequencedSet 同时继承自 Set 和 SequencedCollection,具体源码如下:
interface SequencedSet<E> extends Set<E>, SequencedCollection<E> { SequencedSet<E> reversed(); }
里面就重载了一个reversed()方法,获取逆序的有序Set。
5.3 SequencedMap接口
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(); }
SequencedMap 中方法说明如下:
- reversed():返回一个 entry 逆序的 SequencedMap。
- sequencedKeySet(): 方法返回包含 key 的 SequencedSet。
- sequencedValues(): 方法返回包含 value 的 SequencedCollection。
- sequencedEntrySet(): 方法返回包含 entry 的 SequencedSet。
- putFirst 和 putLast(): 分别在 entry 的最前和最后位置插入键值对,并会将值返回。
- firstEntry() 和 lastEntry(): 分别获取第一个和最后一个 entry。
- pollFirstEntry() 和 pollLastEntry(): 分别删除第一个和最后一个 entry。
6.使用顺序集合的优势
使用Java 21的顺序集合有很多优势:
- 它们提供了一种更高效的数据结构来存储和处理集合元素。
- 新的接口和方法使得对集合的操作更加灵活和方便。
- 顺序集合可以更好地满足不断变化的应用需求,提高代码的可读性和可维护性。
7.结论
以上我们详细介绍了Java21顺序集合的新特性,包括新增的3个接口及其内置方法,总之 Java 21的顺序集合是一种强大的新特性,它为开发人员提供了一种更有效和灵活的方式来存储和处理元素集合。通过使用这些新的接口和方法,开发人员可以更轻松地处理集合数据,提高代码的可读性和可维护性。因此,开发人员应该积极尝试和使用Java 21的顺序集合特性,以提高应用程序性能和开发效率。