[コード比較] ArrayList と Collections.singletonList

WBOY
リリース: 2024-08-06 13:20:50
オリジナル
361 人が閲覧しました

[Code Compare] ArrayList vs Collections.singletonList

同じ機能をコード化するさまざまな方法を比較する新しいスレッドを開始しています。この投稿では、要素が 1 つだけの単純なリストを作成する 2 つの一般的な方法を比較します。具体的には、最も一般的に使用される List 実装コンストラクターと、単一の要素を含む不変リストを作成するための簡単なファクトリ メソッドである Collections.singletonList を調べます。

配列リスト

初期容量を指定せずに ArrayList を初期化するたびに、空の配列から開始されます。最初の要素を追加すると、配列のコピーを伴う比較的複雑なアルゴリズムを使用して ArrayList のサイズが変更されます。 ArrayList 構造を見てみましょう:

  private static final int DEFAULT_CAPACITY = 10;
  private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

  public ArrayList() {
    this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
  }

  public boolean add(E e) {
    modCount++;
    add(e, elementData, size);
    return true;
  }

  private void add(E e, Object[] elementData, int s) {
    if (s == elementData.length)
        elementData = grow();
    elementData[s] = e;
    size = s + 1;
  }

  private Object[] grow() {
      return grow(size + 1);
  }

  private Object[] grow(int minCapacity) {
    return elementData = Arrays.copyOf(elementData,
                                      newCapacity(minCapacity));
  }

  private int newCapacity(int minCapacity) {
    // overflow-conscious code
    int oldCapacity = elementData.length;
    int newCapacity = oldCapacity + (oldCapacity >> 1);
    if (newCapacity - minCapacity <= 0) {
        if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA)
            return Math.max(DEFAULT_CAPACITY, minCapacity);
        if (minCapacity < 0) // overflow
            throw new OutOfMemoryError();
        return minCapacity;
    }
    return (newCapacity - MAX_ARRAY_SIZE <= 0)
        ? newCapacity
        : hugeCapacity(minCapacity);
  }
ログイン後にコピー

何が起こるかを段階的に説明します:

  1. 最初の空の配列 elementData が作成されます。
  2. 最初の要素を追加すると、現在のサイズ (ゼロ) が配列の長さと比較されます。
  3. サイズがゼロであることが判明したため、新しい要素に対応するために配列を拡張する必要があります。
  4. grow メソッドが呼び出され、新しい容量が計算されます。
  5. newCapacity は最初に古い容量の半分だけ増加します。これにより、0 + 0/2 = 0 となります。
  6. newCapacity は要素を収容するのに十分ではないため、続行します。
  7. elementData が同じ初期の空の配列であることが判明したため、最終的には必要なサイズ (1) と DEFAULT_CAPACTIY (10) の間の最大値を返し、サイズ 10 の配列になります。

常に 1 つの要素を含む単純なリストのみが必要な場合、このサイズ変更プロセスは非常に複雑です。

そうは言っても、代替案について話しましょう!

コレクション::singletonList

メソッドのシグネチャ:

パブリック静的リスト singletonList(T o)

説明

このメソッドは、指定されたオブジェクトのみを含む不変のリストを返します。 Java 1.3 で導入された singletonList には、いくつかの利点があります。

  1. インライン実装: 単一行で目的の要素を使用して初期化できます。
  2. 不変性: その実装を見てみましょう:

    private static class SingletonList<E> extends AbstractList<E>
        implements RandomAccess, Serializable {
    
      private final E element;
    
      SingletonList(E obj) {
        element = obj;
      }
      ...
    }
    
    ログイン後にコピー

    SingletonList が継承する AbstractList は、すべての変更可能なメソッドを次のように定義します。

      public boolean add(E e) {
        add(size(), e);
        return true;
      }
    
      public void add(int index, E element) {
        throw new UnsupportedOperationException();
      }
    
      public E remove(int index) {
        throw new UnsupportedOperationException();
      }
    
      public E set(int index, E element) {
          throw new UnsupportedOperationException();
      }
    
    ログイン後にコピー

    これにより、リストのサイズやその単一要素の内容を唱えることが不可能になります。

    不変性は非常に有利な機能です。ここでは詳しく説明しませんが、興味のある開発者はこの記事から詳細を学ぶことができます。

  3. メモリ割り当て: SingletonList クラスには、単純な ArrayList 単純コンストラクターを使用して配列を残す配列を使用する ArrayList とは異なり、単一の要素を収容するための単純なフィールドが 1 つだけ含まれています。要素追加後のサイズは 10 になります。

  4. CPU 使用率: SingletonList コンストラクターは単一の要素をパラメーターとして受け入れ、サイズ変更、配列のコピー、または操作を必要としません。これは、ArrayList の追加メソッドと比較してはるかに効率的です。

結論

この投稿では、単一要素で単純なリストを作成する 2 つの方法、ArrayListconstructor を使用する方法と Collection.singletonList メソッドを使用する方法を比較しました。 ArrayList は柔軟で一般的に使用されるデータ構造ですが、特に要素を追加するときのメモリ割り当てと CPU 使用率の点で、不必要なオーバーヘッドが発生します。このオーバーヘッドには配列のサイズ変更とコピーが含まれますが、要素を 1 つだけ保持することを目的としたリストでは冗長になる可能性があります。ただし、この要素を変更する必要がある場合は、ArrayList が適切なソリューションです。

一方、Collection.singletonList は、単一要素のリストを作成するためのより効率的な代替手段を提供します。この方法は、より簡潔で使いやすいだけでなく、不変性も保証するため、多くのシナリオで大きな利点となります。 ArrayList と比較してメモリ使用量が最小限であり、CPU リソースをほとんど必要としません。

要約すると、要素を 1 つだけ含む単純で不変のリストの場合、Collection.singletonList は効率性、単純さ、不変性の点で優れた選択肢となります。ただし、リスト内の要素を変更する必要がある場合は、ArrayList の方が適切な選択肢となる可能性があります。

次の投稿では、単一要素リストの別の代替手段である List.of ファクトリ メソッドを比較します。また会いましょう!

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

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!