首頁  >  文章  >  Java  >  [程式碼比較] Collections.singletonList 與 List.of

[程式碼比較] Collections.singletonList 與 List.of

王林
王林原創
2024-08-07 09:24:40378瀏覽

[Code Compare] Collections.singletonList vs List.of

在這一系列帖子中,我正在比較編寫相同功能的不同方法。上一篇文章比較了 Collections.singletonList 和 ArrayList 建立單元素清單的方法。

在這篇文章中,我將比較 Collections.singletonList 與另一個著名的工廠方法 List.of。

集合::singletonList

方法簽名

公用靜態;列表 singletonList(T o)

  public static void main(String[] args) {
    final var addresses = Collections.singletonList(
        new Address(
            "742 Evergreen Terrace",
            "Springfield",
            "New York",
            "13468",
            "US"
        ));

    System.out.println(addresses);
  }

描述

此方法傳回一個僅包含指定物件的不可變清單。它是在 Java 1.3 中引入的。上一篇文章介紹了相對 ArrayList 的優點,但回顧一下:

  1. 內嵌實作: 在一行中使用所需的元素進行初始化。
  2. 不變性:清單的大小和單一元素的內容不能更改。
  3. 記憶體分配: SingletonList 類別僅包含單一元素的一個欄位。
  4. CPU 使用率: SingletonList 建構子接受單一元素作為參數,不需要調整大小或陣列運算。

列表::的

方法簽名

靜態;列表的()

  public static void main(String[] args) {
     final var addresses2 = List.of(
        new Address(
            "1007 Mountain Drive",
            "Bristol Township",
            "New Jersey",
            null,
            "US"
        ));

    System.out.println(addresses2);
  }

描述

List.of(E e) 方法也是一個傳回不可修改清單的工廠方法。與僅支援一個元素的 Collections.singletonList(E e) 不同,List.of 支援 0 到 10 個元素,以及具有多個元素的陣列。它在 Java 9 中引入,距離 singletonList 17 年。

有趣的是,與 SingletonList 不同,它有註解:

傳回一個不可變列表僅包含指定的物件。

Array.of 聲明它是一個 不可修改的清單:

傳回包含一個元素的不可修改清單。

這反映了對集合不變性的新理解。根據此文件:

如果元素無法新增、刪除或替換,則集合被視為不可修改。但是,只有當集合中包含的元素不可變時,不可修改的集合才是不可變的。

儘管術語存在差異,但這兩種工廠方法具有幾乎相同的功能。深入查看 UnmodifyingList 內部,我們可以發現:

  static <E> List<E> of(E e1) {
      return new ImmutableCollections.List12<>(e1);
  }

令人驚訝的是,他們使用了不太精確的術語不可變,不過!

  static final class List12<E> extends     
    AbstractImmutableList<E> implements Serializable {

        @Stable
        private final E e0;

        @Stable
        private final E e1;

        List12(E e0) {
            this.e0 = Objects.requireNonNull(e0);
            this.e1 = null;
        }
        ...
    }
static abstract class AbstractImmutableList<E> extends
  AbstractImmutableCollection<E> implements List<E>, RandomAccess {

      // all mutating methods throw UnsupportedOperationException
      @Override public void    add(int index, E element) { throw uoe(); }
      @Override public boolean addAll(int index, Collection<? extends E> c) { throw uoe(); }
      @Override public E       remove(int index) { throw uoe(); }
      @Override public void    replaceAll(UnaryOperator<E> operator) { throw uoe(); }
      @Override public E       set(int index, E element) { throw uoe(); }
      @Override public void    sort(Comparator<? super E> c) { throw uoe(); }

唯一的區別是 List12 有兩個欄位用於潛在的兩個元素,這也導致記憶體佔用可以忽略不計,除非處理大型物件。

結論

這次,我們比較了 Collections.singletonList 和 List.of 工廠方法來建立單元素清單。我們討論了 immutableunmodulated 的語義,並表明這兩種方法都是高效、簡潔且資源輕的。如果您可以使用更新的 Java 版本,那麼它會更受歡迎,因為它熟悉、清晰,而且因為我們使用 List 介面的次數比 Collection 多得多。如果僅限於較舊的 Java 版本,Collections.singletonList 仍然是一個不錯的選擇。

以上是[程式碼比較] Collections.singletonList 與 List.of的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn