37

ArrayList の Java ドキュメントを見たところ、ArrayList の初期容量が 10 であることがわかりました。

 /**
 * Constructs an empty list with an initial capacity of ten.
 */
public ArrayList() {
this(10);
}

2 のべき乗であれば意味があると思いますが、なぜ 10 なのですか?

HashMap の初期容量も調べたところ、16 でした。

/**
 * The default initial capacity - MUST be a power of two.
 */
static final int DEFAULT_INITIAL_CAPACITY = 16;

/**
 * Constructs an empty <tt>HashMap</tt> with the default initial capacity
 * (16) and the default load factor (0.75).
 */
public HashMap() {
    this.loadFactor = DEFAULT_LOAD_FACTOR;
    threshold = (int)(DEFAULT_INITIAL_CAPACITY * DEFAULT_LOAD_FACTOR);
    table = new Entry[DEFAULT_INITIAL_CAPACITY];
    init();
}

10という数字の背後に特定の理由はありますか?

4

7 に答える 7

42

ArrayList単純な成長配列です。要素を追加しようとしてバッファ サイズを超えると、単純に大きくなります。したがって、初期サイズは任意の正の値にすることができます。

1は少なすぎるでしょう。いくつかの要素がある場合でも、いくつかのサイズ変更操作があります。

100 はスペースの損失になります。

したがって、10 は妥協です。なぜ 12 や 8 ではなく 10 なのですか? 最初のヒントは、典型的なユースケースが分析され、これがパフォーマンスの損失とスペースの損失の間の最適な適合であるということです。しかし、Sun の元のコードを見ると、それほど深く分析されておらず、任意の「小さすぎず、大きすぎない」数値であると思います。

于 2012-05-29T07:45:23.773 に答える
13

List の場合、容量を 2 の累乗にするメリットはありません。実際、特定の開始容量に実際の利点はありません。小さいリストの一般的なケースでは、複数のサイズ変更手順を避けるために十分な大きさである必要があり、同じ場合に未使用の容量でメモリを浪費しないように十分小さくする必要があります。10 が選択されたのは、これらの要件を満たすのに適切な範囲にあり、「ラウンド」であるという理由だけであると考えられます。

于 2012-05-29T07:41:30.610 に答える
10

VectorArrayList、JDK 1.0 からのデフォルトの初期容量は 10 だったので、1.2で導入されたときに一貫性を保つことにはおそらく意味がありました。

于 2012-05-29T07:48:28.277 に答える
5

完全に恣意的な選択。

そして、ここで 2 の累乗がこれ以上理にかなっている理由はありません。ハッシュがどのように機能するかにより、HashMap では意味があります。実際、それは 2 の累乗でなければなりません(ソースのコメントによると)。

java.util.Vector (ArrayList の兄) にも 10 があることに注意してください。

于 2012-05-29T07:41:21.107 に答える
1

10 は、デフォルトの要素数としては多かれ少なかれ恣意的な数値です。

于 2012-05-29T07:40:58.703 に答える
0

コードにコメントがない限り、確実なことはわかりません。しかし、ある時点で、Sun のエンジニアが多数の実世界のアプリケーションで ArrayList の使用に関する統計を収集し、経験的に ... 10 個が平均しておおよそ最良の結果をもたらすと判断したと思います。(オプティマイザ、バイトコード設計などを調整する方法です。)

また、他の人が指摘したように、 のサイズに 2 のべき乗のサイズを使用しても、計算上の利点 (または欠点) はありませんArrayList

于 2012-05-29T07:42:48.107 に答える