この一連の投稿では、同じ機能をコード化するさまざまな方法を比較しています。前回の投稿では、単一要素のリストを作成するために 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) メソッドも、変更不可能なリストを返すファクトリ メソッドです。 1 つの要素のみをサポートする Collections.singletonList(E e) とは異なり、List.of は 0 ~ 10 の要素と、複数の要素を含む配列をサポートします。これは、singletonList から 17 年後の Java 9 で導入されました。
SingletonList とは異なり、次のコメントがあることに注目してください:
指定されたオブジェクトのみを含む不変リストを返します。
Array.of は、変更不可能なリストであることを示しています:
1 つの要素を含む変更不可能なリストを返します。
これは、コレクションの不変性についての新たな理解を反映しています。このドキュメントによると:
要素を追加、削除、または置換できない場合、コレクションは変更不可能とみなされます。ただし、変更不可能なコレクションは、コレクションに含まれる要素が不変である場合にのみ不変になります。
このような用語の違いにもかかわらず、どちらのファクトリ メソッドもほぼ同じ機能を持っています。 UnmodifiableList の内部を深く調べると、次のことがわかります。
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 には潜在的に 2 つの要素に対して 2 つのフィールドがあることです。これにより、大きなオブジェクトを処理しない限り、メモリ使用量も無視できます。
今回は、Collections.singletonList と List.of ファクトリメソッドを比較して、単一要素のリストを作成しました。 immutable と unmodifiable のセマンティクスについて説明し、どちらの方法も効率的で、簡潔で、リソースが少ないことを示しました。より新しい Java バージョンを使用できる場合は、その使いやすさと明瞭さ、そしてコレクションよりもリスト インターフェイスをよく使用するため、そのバージョンの方が望ましいと考えられます。古い Java バージョンに制限されている場合は、Collections.singletonList が引き続き有力な選択肢となります。
以上が[コード比較] Collections.singletonList と List.ofの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。