it-swarm.com.de

Warum ist die Standardkapazität von ArrayList 10?

Ich habe das Java-Dokument für ArrayList gesehen und festgestellt, dass die anfängliche Kapazität von ArrayList 10 beträgt.

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

Ich denke, es wäre sinnvoll, wenn es eine Potenz von 2 wäre, aber warum 10?

Ich habe auch die anfängliche Kapazität von HashMap überprüft, und es ist 16, was Sinn macht.

/**
 * 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();
}

Gibt es einen bestimmten Grund für die Zahl 10?

34
Priyank Doshi

Die Variable ArrayList ist ein einfaches wachsendes Array. Wenn Sie versuchen, ein Element hinzuzufügen und die Puffergröße überschritten wird, wird es einfach größer. Die Anfangsgröße kann also ein beliebiger positiver Wert sein.

Die 1 wäre zu wenig. Selbst mit wenigen Elementen werden wir einige Größenänderungsoperationen durchführen.

Die 100 wäre ein Platzverlust.

Die 10 ist also ein Kompromiss. Warum 10 und nicht 12 oder 8? Erster Hinweis, dass die typischen Anwendungsfälle analysiert wurden, und dies ist die beste Übereinstimmung zwischen Leistungsverlust und Platzverlust. Ich denke jedoch, als ich den ursprünglichen Code der Sonne sah, dass er nicht so tief analysiert wurde und eine willkürliche Zahl "nicht zu klein" ist.

39
Stepan Vihor

Für eine Liste gibt es keinen Vorteil, wenn die Kapazität eine Zweierpotenz ist. In der Tat gibt es keinen wirklichen Vorteil bei einer bestimmten Startkapazität. Sie muss groß genug sein, um mehrere Größenanpassungsschritte für die üblichen Fälle von kleinen Listen zu vermeiden, und klein genug, um in diesem Fall keinen Speicherplatz für nicht genutzte Kapazität zu verschwenden. 10 wurde wahrscheinlich nur deshalb gewählt, weil es in den richtigen Bereich fällt, um diese Anforderungen zu erfüllen, und weil es "rund" ist.

13

Vector von JDK 1.0 hatte eine voreingestellte Anfangskapazität von 10, daher war es wahrscheinlich sinnvoll, konsistent zu bleiben, als sie ArrayList in 1.2 einführte.

10
Denham Coote

Völlig willkürliche Wahl.

Und es gibt keinen Grund, warum Zweierpotenzen hier sinnvoller sind. In einer HashMap macht es Sinn, wie das Hashing funktioniert. Tatsächlich ist es muss sein eine Zweierpotenz (gemäß dem Kommentar in der Quelle).

Beachten Sie, dass Java.util.Vector (der ältere Bruder von ArrayList) ebenfalls 10 hat.

5
Thilo

10 ist wahrscheinlich eine mehr oder weniger beliebige Zahl für die Standardanzahl von Elementen.

1
Pramod Kumar

ArrayList ist nur ein Array, das automatisch wachsen kann.

Ja, die Standardgröße ist 10

und ich denke, dass hinter diesem Anfangs-/Standardwert nicht viel zu denken ist. Der Standardwert 10 scheint einfach nicht sehr groß und auch nicht zu klein zu sein des Arrays ..? Die nächste Kapazität für das Array wird berechnet durch

New capacity=(current capacity*3)/2+1
So next size would be (10*3)/2+1= 16
And next (16*3)/2+1= 25
And So on...
0
Shubham Soni

Wenn der Code keinen Kommentar enthält, wissen wir nie genau, was er sagt. Ich stelle mir jedoch vor, dass ein Sun-Ingenieur irgendwann Statistiken über die Verwendung von ArrayList über eine große Anzahl realer Anwendungen gesammelt und festgestellt hat ... empirisch ..., dass 10 im Durchschnitt die besten Ergebnisse lieferte. (So ​​stellen sie solche Dinge ein, den Optimierer, das Bytecode-Design usw.).

Und, und andere, darauf hingewiesen, gibt es keinen rechnerischen Vorteil (oder Nachteil) bei der Verwendung einer Größe, die eine Zweierpotenz für die Größe eines ArrayList ist.

0
Stephen C