J'ai vu le document Java pour ArrayList et j'ai constaté que la capacité initiale d'ArrayList est de 10.
/**
* Constructs an empty list with an initial capacity of ten.
*/
public ArrayList() {
this(10);
}
Je pense que cela aurait du sens s'il y avait une puissance de 2, mais pourquoi 10?
J'ai également vérifié la capacité initiale de HashMap, et c'est 16, ce qui est logique.
/**
* 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();
}
Y at-il une raison précise derrière le nombre 10?
ArrayList
est un tableau en croissance simple. Lorsque vous essayez d'ajouter un élément et que la taille de la mémoire tampon est dépassée, sa taille augmente simplement. Donc, la taille initiale peut être n'importe quelle valeur positive.
Le 1 serait trop petit. Même avec quelques éléments, nous aurons quelques opérations de redimensionnement.
Le 100 serait une perte d'espace.
Donc, le 10 est un compromis. Pourquoi 10 et pas 12 ou 8? Premier indice, les cas d'utilisation typiques ont été analysés et il s'agit du meilleur ajustement entre perte de performance et perte d'espace. Cependant, je pense, à la lecture du code d'origine du Soleil, qu'il n'a pas été analysé de manière aussi approfondie et qu'il s'agit d'un nombre arbitraire «pas trop petit, pas trop gros».
Pour une liste, il n'y a aucun avantage à avoir une capacité de deux. En fait, il n’ya aucun avantage réel dans une capacité de démarrage spécifique. Il doit être suffisamment volumineux pour éviter plusieurs étapes de redimensionnement dans le cas courant de petites listes et suffisamment petit pour ne pas gaspiller de mémoire sur une capacité inutilisée dans le même cas. 10 a probablement été choisi simplement parce qu'il se situe dans la fourchette appropriée pour répondre à ces exigences et parce qu'il est "rond".
Vector
, à partir de JDK 1.0 avait une capacité initiale par défaut de 10, il était donc probablement logique de rester cohérent lorsqu’ils ont introduit ArrayList
dans 1.2.
Choix complètement arbitraire.
Et il n'y a aucune raison pour que la puissance de 2 ait plus de sens ici. Cela a du sens dans un HashMap, à cause du fonctionnement du hachage. En fait, il doit être une puissance de deux (selon le commentaire dans la source).
Notez que Java.util.Vector (qui est le frère aîné de ArrayList) en a aussi 10.
10 est probablement un nombre plus ou moins arbitraire pour le nombre d'éléments par défaut.
ArrayList est juste un tableau qui peut croître automatiquement ..
Oui..la taille par défaut est 10
et je pense qu’il n’ya pas beaucoup de réflexion derrière cette valeur initiale/par défaut.La valeur par défaut 10 ne semble tout simplement pas trop grande ni aussi trop petite. du tableau ...? La capacité suivante du tableau est calculée par-
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...
À moins d'un commentaire dans le code, nous ne le saurons jamais avec certitude. Toutefois, j’imagine qu’un ingénieur Sun a rassemblé des statistiques sur l’utilisation d’ArrayList pour un grand nombre d’applications réelles et déterminé ... empiriquement ... que 10 donnaient à peu près les meilleurs résultats en moyenne. (C'est comme ça qu'ils ajustent des choses comme celle-ci, l'optimiseur, la conception du bytecode, etc.)
Et, comme l'ont souligné d'autres personnes, il n'y a pas d'avantage en calcul (ou désavantage) à utiliser une taille qui est une puissance de deux pour la taille d'une ArrayList
.