Mb61d56cf64b47d 2022-01-15 02:59:23 阅读数:117
ArrayListAnalyse du code source
1. Introduction
Tableau
(Object[] elementData),La taille initiale de l'acquiescement est10(C'était la première fois queaddInitialiser la capacité du tableau à) downloadStructure tacite sans paramètres
,La capacité n'est pas assignée à la capacité initiale tacite dans le constructeur tacite sans paramètres10,Au lieu de cela, pointez le tableau vers un tableau vide,Reporter la demande de capacité de tableau à la première foisaddMoyenne(En basaddLa méthode analysera)/** Structure tacite */
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
// DEFAULTCAPACITY_EMPTY_ELEMENTDATAEst un tableau constant vide
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
Copier le Code
initialCapacityL'architecte de
,EntréeinitialCapacity < 0Peut lancer une exception// Valeur de capacité initiale entranteinitialCapacityL'architecte de,Moins de0Peut lancer une exception
public ArrayList(int initialCapacity) {
if (initialCapacity > 0) {
this.elementData = new Object[initialCapacity];
} else if (initialCapacity == 0) {
this.elementData = EMPTY_ELEMENTDATA;
} else {
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
}
}
Copier le Code
// Passer dans un autreCollectionClasse de convergence complète de l'interface(List、SetAttendez.)L'architecte de
// En fait, c'est un tableauArrays.copyFonctionnement
public ArrayList(Collection<? extends E> c) {
elementData = c.toArray();
if ((size = elementData.length) != 0) {
// c.toArray might (incorrectly) not return Object[] (see 6260652)
if (elementData.getClass() != Object[].class)
elementData = Arrays.copyOf(elementData, size, Object[].class);
} else {
// replace with empty array.
this.elementData = EMPTY_ELEMENTDATA;
}
}
Copier le Code
// Ajouter un élément
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
Copier le Code
private void ensureCapacityInternal(int minCapacity) {
ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}
Copier le Code
// Pour calculer la capacité
private static int calculateCapacity(Object[] elementData, int minCapacity) {
// QuandelementDataC'est la première fois qu'un tableau videaddHeure,Définir la capacité pour accepter la capacité initiale10
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
return Math.max(DEFAULT_CAPACITY, minCapacity);
}
// Sinon, la capacité estsize+1
return minCapacity;
}
Copier le Code
// Pour l'agrandissement
private void ensureExplicitCapacity(int minCapacity) {
modCount++; // Il est principalement utilisé pour déterminer s'il y a des exceptions qui ont été corrigées dans l'itération
// overflow-conscious code
// Ce n'est que la première fois ici et derrièresizeDépasser la capacité du tableau lui - même pour augmenter la capacité
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
Copier le Code
// Expansion de la capacité,Pour la première fois10、Derrière, c'est avant1.5X
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length; // Au débutelementDataEst un tableau vide,Voici0
int newCapacity = oldCapacity + (oldCapacity >> 1); // Expansion à1.5X
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
Copier le Code
public E remove(int index) {
rangeCheck(index);
modCount++;
E oldValue = elementData(index);
int numMoved = size - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
elementData[--size] = null; // clear to let GC do its work
return oldValue;
}
Copier le Code
// Traversée,Trouver l'application égale du premier élémentfastRemoveSupprimer
public boolean remove(Object o) {
if (o == null) {
for (int index = 0; index < size; index++)
if (elementData[index] == null) {
fastRemove(index);
return true;
}
} else {
for (int index = 0; index < size; index++)
if (o.equals(elementData[index])) {
fastRemove(index);
return true;
}
}
return false;
}
// Suivez - moi.remove(index)À peu près la même chose.,Il manque justerangeCheckEt valeurs de retour(Après tout, ce n'est pas nécessaire)
private void fastRemove(int index) {
modCount++;
int numMoved = size - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
elementData[--size] = null; // clear to let GC do its work
}
Copier le Code
4. Résumé
Tableau
,Ce sera la première fois queaddQuand10Comme capacité initiale tacite
,Chaque foisL'expansion est antérieure à1.5X
Et appliquerSystem.arraycopyCopier l'élément dans le tableau agrandiOrdre de stockage
Impossible de garantir la sécurité du fil
download
版权声明:本文为[Mb61d56cf64b47d]所创,转载请带上原文链接,感谢。 https://javamana.com/2022/01/202201150254131225.html