」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > [程式碼比較] Collections.singletonList 與 List.of

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

發佈於2024-08-07
瀏覽:199

[Code Compare] Collections.singletonList vs List.of

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

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

集合::singletonList

方法簽名

public static List 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 建構子接受單一元素作為參數,不需要調整大小或陣列操作。

清單

方法簽名

static List of()

  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 個元素,以及具有多個元素的陣列。它是在 singletonList 17 年後在 Java 9 中引入的。

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

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

Array.of 表明它是一個 不可修改的列表:

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

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

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

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

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

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

  static final class List12 extends     
    AbstractImmutableList 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 extends
  AbstractImmutableCollection implements List, 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 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 工廠方法來建立單元素清單。我們討論了 不可變不可修改 的語義,並表明這兩種方法都是高效、簡潔和資源輕的。如果您可以使用更新的 Java 版本,那麼它是最好的,因為它熟悉、清晰,而且因為我們使用 List 介面比 Collections 多得多。如果僅限於較舊的 Java 版本,Collections.singletonList 仍然是一個不錯的選擇。

版本聲明 本文轉載於:https://dev.to/leandrostl/code-compare-collectionssingletonlist-vs-listof-385?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3