2010-06-22 5 views
0

Comme nous le savons ArrayList augmente sa taille de 50% lorsque des éléments sont ajoutés (100% en vecteur de Vector) .On peut trouver l'implémentation de ce comportement?java Taille de l'arracheur?

Thx

Répondre

4

En ArrayList:

public void ensureCapacity(int minCapacity) { 
    modCount++; 
    int oldCapacity = elementData.length; 
    if (minCapacity > oldCapacity) { 
    Object oldData[] = elementData; 
    int newCapacity = (oldCapacity * 3)/2 + 1; 
    if (newCapacity < minCapacity) 
     newCapacity = minCapacity; 
    // minCapacity is usually close to size, so this is a win: 
    elementData = Arrays.copyOf(elementData, newCapacity); 
    } 
} 

et Vector:

private void ensureCapacityHelper(int minCapacity) { 
    int oldCapacity = elementData.length; 
    if (minCapacity > oldCapacity) { 
    Object[] oldData = elementData; 
    int newCapacity = (capacityIncrement > 0) ? 
     (oldCapacity + capacityIncrement) : (oldCapacity * 2); 
    if (newCapacity < minCapacity) { 
     newCapacity = minCapacity; 
    } 
    elementData = Arrays.copyOf(elementData, newCapacity); 
    } 
} 

Note:capacityIncrement par défaut 0 moins d'être otherwi Donc, le comportement par défaut d'un Vector est de doubler chaque fois que le tableau de sauvegarde doit être étendu, mais si vous définissez capacityIncrement, il sera incrémenté par cela.

Dans tous les cas (pour ArrayList et Vector) l'augmentation - indépendamment de ce qu'elle est - est remplacée si la nouvelle capacité n'est pas encore assez grande, auquel cas la capacité requise est utilisée.

+0

Preuve, ne peut pas argumenter avec le code ... – jjnguy

+1

Notez que cela a été complètement réécrit pour JDK 7: http://cr.openjdk.java.net/~martin/webrevs/openjdk7/ArrayResize/ –

4

Où pouvons-nous trouver la mise en œuvre de ce comportement?

Dans le code source. Vous pouvez trouver le code source des bibliothèques de classes Sun Java dans le fichier "src.zip" de votre installation de Sun JDK. Les sources pour OpenJDK 6 et OpenJDK 7 peuvent également être téléchargées via le OpenJDK Project page. Pour les autres implémentations Java, regardez sur le web ou consultez la documentation.

Méfiez-vous - toutes les bibliothèques de classes Java n'implémentent pas ces classes de la même manière. Ainsi, par exemple, l'examen des sources du projet Apache Harmony ou des sources de projet GNU Classpath ne vous dira pas comment fonctionnent les bibliothèques de classes Sun JDK.

0

.. dans la mise en œuvre de ArrayList#add!?

est ici une implémentation:

public boolean add(E object) { 
    if (lastIndex == array.length) { 
    growAtEnd(1); 
    } 
    array[lastIndex++] = object; 
    modCount++; 
    return true; 
} 

Il appelle growAtEnd et à l'intérieur de cette méthode, nous trouvons l'extrait:

} else { 
    int increment = size/2; 
    if (required > increment) { 
    increment = required; 
    } 
    if (increment < 12) { 
    increment = 12; 
    } 
    E[] newArray = newElementArray(size + increment); 
    if (size > 0) { 
    System.arraycopy(array, firstIndex, newArray, 0, size); 
    firstIndex = 0; 
    lastIndex = size; 
    } 
    array = newArray; 

.. où l'incrément est fixé à 50% de la taille réelle de la liste actuelle.


docjar contient le code source du Apache harmony project, Apaches open source plate-forme Java SE 6. Il y a beaucoup d'implémentations Java différentes et il n'est pas garanti que chaque implémentation montre exactement le même comportement (comme augmenter la taille par pas de 50%) tant qu'elle n'est pas documentée/requise dans l'interface de cette méthode.

+0

cette implémentation est différente: http://developer.classpath.org/doc/java/util/ArrayList-source.html –

+0

Pas comme Andreas .. Initialement ArrayList aura une capacité par défaut (pour le vecteur, il est 10) .S'il n'y a pas de place pour un nouvel élément qui est ajouté plus tard, il l'augmentera de 50%. – JavaUser

+0

@ RC..So quelle est la conclusion? – JavaUser