同じ機能をコード化するさまざまな方法を比較する新しいスレッドを開始しています。この投稿では、要素が 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 つの要素を含む単純なリストのみが必要な場合、このサイズ変更プロセスは非常に複雑です。
そうは言っても、代替案について話しましょう!
パブリック静的 このメソッドは、指定されたオブジェクトのみを含む不変のリストを返します。 Java 1.3 で導入された singletonList には、いくつかの利点があります。 不変性: その実装を見てみましょう: SingletonList が継承する AbstractList は、すべての変更可能なメソッドを次のように定義します。 これにより、リストのサイズやその単一要素の内容を唱えることが不可能になります。 不変性は非常に有利な機能です。ここでは詳しく説明しませんが、興味のある開発者はこの記事から詳細を学ぶことができます。 メモリ割り当て: SingletonList クラスには、単純な ArrayList 単純コンストラクターを使用して配列を残す配列を使用する ArrayList とは異なり、単一の要素を収容するための単純なフィールドが 1 つだけ含まれています。要素追加後のサイズは 10 になります。 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 サイトの他の関連記事を参照してください。
説明
private static class SingletonList<E> extends AbstractList<E>
implements RandomAccess, Serializable {
private final E element;
SingletonList(E obj) {
element = obj;
}
...
}
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();
}
結論