4

このコードは、guava ライブラリの単純なコードです。

読みやすいように単純化しました。元のコードは =>リンクを参照してください

// Case A
public static <E> ArrayList<E> newArrayList(E... elements) {
    int capacity = computeArrayListCapacity(elements.length);
    ArrayList<E> list = new ArrayList<E>(capacity);
    Collections.addAll(list, elements);
    return list;
}

static int computeArrayListCapacity(int arraySize) {
    long value = 5L + arraySize + (arraySize / 10);
    if (value > Integer.MAX_VALUE) {
        return Integer.MAX_VALUE;
    }
    if (value < Integer.MIN_VALUE) {
        return Integer.MIN_VALUE;
    }
    return (int) value;
}

なぜ容量を5L + arraySize + (arraySize / 10)に設定するのですか?

3 つのケース (A、B、C) の違いは何ですか?

//Case B
public static <E> ArrayList<E> newArrayList(E... elements) {
    ArrayList<E> list = new ArrayList<E>(elements.length);
    Collections.addAll(list, elements);
    return list;
}

//Case C
public static <E> ArrayList<E> newArrayList(E... elements) {
    ArrayList<E> list = new ArrayList<E>();
    Collections.addAll(list, elements);
    return list;
}
4

1 に答える 1

3

Matthias のコメントに追加することはあまりありません。

ケース A は、後でリストが大きくなった場合に最適ですが、それほど多くはありません。10% 未満で、さらに 5 つの要素が追加されます。成長しない場合は、メモリを無駄にしています。それがさらに大きくなると、ある程度のサイズ変更が行われますが、一般的には誰もそれについてできることはありません.

ケース B は、リストが大きくならない可能性が低い場合に最適です。しかし、通常はImmutableList代わりに を使用できるため、これはありそうにありません。

ケース C では、最初に 10 個の要素の配列を割り当てます。次に、この配列を で複数回置き換えることができますCollections.addAll。IUIIC では 2 回発生しelements.length==16ます (つまり10 -> 15 -> 22、ArrayList の成長係数が 1.5 であるため)。

于 2013-09-26T08:26:08.233 に答える