3

Android プログラミングの場合、メソッドで ArrayList を作成していて、メソッドからそれを返すときにリストがどれくらい大きくなるかを知っている場合、リストを作成するときにリストの初期サイズを指定する必要がありますか?

通常、初期サイズをわざわざ指定しないので質問していますが、モバイル向けのプログラミングでは違いが生じる可能性があります。

ありがとう。

編集

リストの最終的なサイズがわかっているケースについて話している(たとえば、タイプ A のオブジェクトのリストからタイプ B のオブジェクトのリストを作成している)。

編集 2

これに関連するパフォーマンス指標はありますか?

4

7 に答える 7

0

ここでは、他の Java アプリケーションと同じことが言えると思います。ボトルネックであることが判明した場合にのみ、これらのマイクロ最適化を気にする必要はありません。JCF のデータ構造には妥当なデフォルトがあります。

ArrayList() {
     this(10);
}

これは のデフォルトですArrayList

注意すべきことは、メソッドの空間時間の複雑さです。

于 2013-11-12T19:19:03.773 に答える
0

はい、ArrayList は動的サイズで処理するように設計されていますが、リストに含まれるアイテムの数が事前にわかっている場合は、指定されたサイズで開始することをお勧めします。他の開発者がコードを読みやすくなります。

于 2013-11-12T19:20:16.780 に答える
0

List または任意のコレクションのサイズがわかっている場合は、事前にサイズを指定する方がはるかに効率的です。その理由は、実装に応じて、コレクションを成長させるのにサイクルがかかるためです。

于 2013-11-12T19:17:48.043 に答える
0

はい、ArrayListこの場合、コンストラクターに容量を渡す必要があります。理由は次のとおりです。

呼び出すコンストラクタは次のとおりです。

public ArrayList(int initialCapacity) {
    super();
    if (initialCapacity < 0)
        throw new IllegalArgumentException("Illegal Capacity: "+
                                           initialCapacity);
    this.elementData = new Object[initialCapacity];
}

を渡すことinitialCapacityで、 をサポートする配列のサイズを設定していますArrayList

リストに追加しようとすると、その要素によってリストのサイズが変更されるとします。実行される一連の関数呼び出しは次のとおりです。

public boolean add(E e) {
    ensureCapacityInternal(size + 1);  // Increments modCount!!
    elementData[size++] = e;
    return true;
}

private void ensureCapacityInternal(int minCapacity) {
    if (elementData == EMPTY_ELEMENTDATA) {
        minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
    }

    ensureExplicitCapacity(minCapacity);
}

private void ensureExplicitCapacity(int minCapacity) {
    modCount++;

    // overflow-conscious code
    if (minCapacity - elementData.length > 0)
        grow(minCapacity);
}

private void grow(int minCapacity) {
    // overflow-conscious code
    int oldCapacity = elementData.length;
    int newCapacity = oldCapacity + (oldCapacity >> 1);
    if (newCapacity - minCapacity < 0)
        newCapacity = minCapacity;
    if (newCapacity - MAX_ARRAY_SIZE > 0)
        newCapacity = hugeCapacity(minCapacity);
    // minCapacity is usually close to size, so this is a win:
    elementData = Arrays.copyOf(elementData, newCapacity);
}

結論として、最終的なサイズがわかっている場合は、それをコンストラクターに渡すことで、配列のサイズを変更する必要がないことを保証できます。

最終的な容量が十分に大きく、ArrayList比較的長期間使用されない場合は、それほど多くのメモリを割り当てたくない場合があります。つまり、必要に応じてサイズを変更する方がよい場合があります。それ以外の場合は、初期容量を渡します。

于 2013-11-18T04:44:38.557 に答える