在這一系列帖子中,我正在比較編寫相同功能的不同方法。上一篇文章比較了 Collections.singletonList 和 ArrayList 建立單元素清單的方法。
在這篇文章中,我將比較 Collections.singletonList 與另一個著名的工廠方法 List.of。
公用靜態
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 的優點,但回顧一下:
靜態
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 工廠方法來建立單元素清單。我們討論了 immutable 和 unmodulated 的語義,並表明這兩種方法都是高效、簡潔且資源輕的。如果您可以使用更新的 Java 版本,那麼它會更受歡迎,因為它熟悉、清晰,而且因為我們使用 List 介面的次數比 Collection 多得多。如果僅限於較舊的 Java 版本,Collections.singletonList 仍然是一個不錯的選擇。
以上是[程式碼比較] Collections.singletonList 與 List.of的詳細內容。更多資訊請關注PHP中文網其他相關文章!