ホームページ  >  記事  >  Java  >  [コード比較] Collections.singletonList と List.of

[コード比較] Collections.singletonList と List.of

王林
王林オリジナル
2024-08-07 09:24:40437ブラウズ

[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 クラスには、単一の要素に対してフィールドが 1 つだけ含まれます。
  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) メソッドも、変更不可能なリストを返すファクトリ メソッドです。 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 ファクトリメソッドを比較して、単一要素のリストを作成しました。 immutableunmodifiable のセマンティクスについて説明し、どちらの方法も効率的で、簡潔で、リソースが少ないことを示しました。より新しい Java バージョンを使用できる場合は、その使いやすさと明瞭さ、そしてコレクションよりもリスト インターフェイスをよく使用するため、そのバージョンの方が望ましいと考えられます。古い Java バージョンに制限されている場合は、Collections.singletonList が引き続き有力な選択肢となります。

以上が[コード比較] Collections.singletonList と List.ofの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。