Bei der Betrachtung verschiedener Sammlungskonstruktoren stellt sich die Frage. Warum erstellt ArrayList () eine leere Liste mit einer Anfangskapazität von zehn und ArrayDeque () erstellt eine leere Array-Deque mit einer Anfangskapazität, die ausreicht, um 16 Elemente aufzunehmen.
java
collections
Alter Badman Gray
quelle
quelle
Antworten:
Kurze Antwort
Da die ArrayDeque-Kapazität eine Zweierpotenz sein muss und 16 die kleinste Zweierpotenz ist, die mindestens 10 beträgt.
ArrayDeque muss überall viele% -Operationen verwenden, um ein lineares Array zu umschließen, das vorgibt, kreisförmig zu sein.
a % b
kann ausgedrückt werden alsa & (b - 1)
obb
eine Zweierpotenz ist. Das bitweise UND ist massiv schneller, sodass die Kapazität von ArrayDeque auf die Zweierpotenz beschränkt ist. Alle% -Operationen werden in der Implementierung mit Bitmasking anstelle des tatsächlichen% ausgeführt.Dies ist auch der Grund, warum die neuere HashMap keine Primzahlentabellengrößen, sondern eine Zweierpotenz verwendet , da die% -Operation so oft und bitweise ausgeführt werden muss und so viel schneller ist.
Wenn die Basislinie 10 ist, sollten Strukturen mit einer Potenz von zwei Einschränkungen 16 verwenden, da es die kleinste Potenz von zwei ist, die mindestens 10 beträgt.
quelle
Schließen Sie nicht aus, dass es keinen bestimmten Grund gibt.
Es könnte sein, dass diese beiden Sammlungen von verschiedenen Teams geschrieben wurden. Beide wählten eine kleine Zahl als Standardkapazität, aber das erste Team dachte dezimal und wählte 10, während das zweite Team binär dachte und 16 wählte.
quelle
@ Esailijas Antwort ist gut für diesen speziellen Fall.
Im Allgemeinen ist es jedoch ein Kompromiss, der von vielen Faktoren abhängt. Ich werde einige Beispiele nennen:
Aufgrund dieser Kompromisse ist es durchaus verständlich, dass verschiedene Erfassungsimplementierungen unterschiedliche optimale Standardkapazitäten aufweisen können.
quelle