Gulbao p6: Java Internet Senior Architect Phase 4

Mb61d56cf64b47d 2022-01-15 02:59:23 阅读数:117

gulbao p6 java internet senior

BubbleP6:JavaArchitecte principal d'Internet4Période

ArrayListAnalyse du code source

1. Introduction

  • ArrayList- Oui.ListClasse d'achèvement de l'interface,Est d'utiliser plus d'outils de convergence dans le développement,Déposé àjava.utilSous le sac.
  • ArrayListSouvent utilisé pour enregistrer une série d'ensembles de données du même type de données
  • 2. Construction de données sous - jacentes
  • ArrayListLa construction de données sous - jacente est une​​Tableau​​(Object[] elementData),La taille initiale de l'acquiescement est10(C'était la première fois queaddInitialiser la capacité du tableau à)​ ​download​
  • 3. Approche clé

3.1 Structure

  • ​Structure 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
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • Valeur de capacité initiale entrante​​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
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • Passer dans un autreCollectionClasse de convergence complète de l'interface(List、SetAttendez.)L'architecte de
// 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
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.

3.2 add

  • addAjouter un élément touche le tableauelementDataLe jugement d'expansion de,modCount++(Il est principalement utilisé pour déterminer s'il y a des exceptions qui ont été corrigées dans l'itération)
  • Affectation du tableau,Taille de l'élément de stockagesize++
// Ajouter un élément
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
Copier le Code
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • Puis regardez la fonction qui confirme la capacitéensureCapacityInternal
private void ensureCapacityInternal(int minCapacity) {
ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}
Copier le Code
  • 1.
  • 2.
  • 3.
  • 4.
  • Ce qui est essentiellement appelé estensureExplicitCapacityApproche,Le paramètre estcalculateCapacityValeur de retour de la méthode
// 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
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
// 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
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • Ensuite, regardez la méthode d'expansion qui est essentiellement appeléegrow,Chaque expansion est une capacité antérieure1.5X
// 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
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.

3.3 remove(int index)

  • Supprimer l'emplacement spécifiéindex,En faitSystem.arraycopyCopier,C'est l'équivalent d'un déplacement​ ​download​
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
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.

3.4 remove(E element)

  • Supprimer l'élément spécifié(Quand il y a plusieurs,Seul le premier)
// 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
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
4. Résumé
  • 1.
  • ArrayListDéposé àjava.utilSous le sac.ListInterface(CoolectionSous - interface pour)Classe d'achèvement pour
  • Utilisé pour enregistrer une série de données convergentes du même type
  • La construction de données sous - jacente est une​​Tableau​​,Ce sera la première fois que​​addQuand10Comme capacité initiale tacite​​,Chaque fois​​L'expansion est antérieure à1.5X​​Et appliquerSystem.arraycopyCopier l'élément dans le tableau agrandi
  • Utiliser un tableau comme structure de données sous - jacente,Il est donc facile de s'assurer que les éléments​​Ordre de stockage​
  • Parce que les méthodes sont toutes asynchrones,Donc...​​Impossible de garantir la sécurité du fil​

 ​download​

版权声明:本文为[Mb61d56cf64b47d]所创,转载请带上原文链接,感谢。 https://javamana.com/2022/01/202201150254131225.html