天天看點

JDK 21新特性:Sequenced Collections簡介

作者:技術古玩

在JDK 21中,引入了一種新的資料結構,名為Sequenced Collections。Sequenced Collections是一種線性資料結構,它的特點是元素之間具有嚴格的順序關系。這種特性使得Sequenced Collections在許多應用場景下具有很大的優勢。

本文将為您詳細介紹Sequenced Collections的用法,以及如何在Java程式中使用Sequenced Collections。

1. 什麼是Sequenced Collections

Java 之前并沒有一個通用的接口來描述具有明确定義的具有順序的集合。例如,雖然 Set 接口本身并沒有規定元素出現的順序,但其子類型 LinkedHashSet 和 SortedSet 卻有着明确的元素出現順序。LinkedHashSet和SortedSet具體的順序相關的描述和方法都是由各自實作的,Sequenced Collections出現就是為了統一這種順序相關的行為。

我給SequencedCollection源碼添加中文翻譯如下:

/**
 * 一個具有明确定義的出現順序,支援兩端操作,并可反轉的集合。順序集合的元素具有周遊順序,其中元素從第一個元素到最後一個元素形成一個線性排列的概念。對于任意兩個元素,一個元素要麼在另一個元素之前(更靠近第一個元素),要麼在其之後(更靠近最後一個元素)。(注意,這個定義并不意味着元素在計算機記憶體中的實體位置等實際位置。)
 * 從 Collection 接口繼承的多個方法需要按照集合的周遊順序操作元素。例如,疊代器方法提供從第一個元素開始的元素,依次周遊到最後一個元素。其他需要按照周遊順序操作元素的方法包括:forEach、parallelStream、spliterator、stream 以及所有的 toArray 方法重載。
 * 此接口提供在集合兩端添加、檢索和删除元素的方法。
 * 此接口還定義了 reversed 方法,提供此集合的反向排序視圖。在反向排序視圖中,首元素和尾元素的概念是颠倒的,後繼元素和前驅元素的概念也是颠倒的。此集合的第一個元素是反向排序視圖的最後一個元素,反之亦然。此集合中某個元素的後繼元素在反向視圖中是其前驅元素,反之亦然。所有尊重集合周遊順序的方法都會像周遊順序被反轉一樣操作。例如,反向視圖的疊代器方法會按照從此集合的最後一個元素到第一個元素的順序報告元素。reversed 方法的可用性及其對所有适用方法的排序語義的影響,使得可以友善地按照正向或反向順序疊代、搜尋、複制和流式處理此集合的元素。
 * 此類是 Java 集合架構的成員。
 *
 */
public interface SequencedCollection<E> extends Collection<E> {
    /**
     * 傳回此集合的反向排序視圖。傳回視圖中元素的周遊順序是此集合元素周遊順序的反轉。反向排序影響所有受順序影響的操作,包括傳回視圖的視圖集合的操作。如果集合實作允許修改此視圖,則修改會“寫入”到基礎集合中。對基礎集合的更改可能會在此反向視圖中可見,也可能不可見,這取決于實作。
     */
    java.util.SequencedCollection<E> reversed();

    /**
     * 将一個元素添加為此集合的第一個元素(可選操作)。操作成功完成後,給定的元素将成為此集合的成員,并且它将是周遊順序中的第一個元素。
     */
    default void addFirst(E e) {
        throw new UnsupportedOperationException();
    }

    /**
     * 将一個元素添加為此集合的最後一個元素(可選操作)。操作成功完成後,給定的元素将成為此集合的成員,并且它将是周遊順序中的最後一個元素。
     */
    default void addLast(E e) {
        throw new UnsupportedOperationException();
    }

    /**
     * 擷取此集合的第一個元素。
     */
    default E getFirst() {
        return this.iterator().next();
    }

    /**
     * 擷取此集合的最後一個元素。
     */
    default E getLast() {
        return this.reversed().iterator().next();
    }

    /**
     * 移除并傳回此集合的第一個元素(可選操作)。
     */
    default E removeFirst() {
        var it = this.iterator();
        E e = it.next();
        it.remove();
        return e;
    }

    /**
     * 移除并傳回此集合的最後一個元素(可選操作)。
     */
    default E removeLast() {
        var it = this.reversed().iterator();
        E e = it.next();
        it.remove();
        return e;
    }
}

           

它目前具有三個比較通用的直接子類接口

  • List: 沒錯,它的父類改了,由之前的Collection改成了SequencedCollection。
  • SequencedMap: LinkedHashMap和SortedMap都是它的子類。
  • SequencedSet:LinkedHashSet和SortedSet都是它的子類。

2. 總結

JDK 21中的Sequenced Collections提供了多種有序資料結構的實作,可以滿足不同的應用場景需求。在使用Sequenced Collections時,開發者需要根據具體的性能需求和記憶體占用情況來選擇合适的實作。

繼續閱讀