Arraylist
La mise en œuvre sous-jacente est un tableau qui a une grande efficacité dans l'accès aux éléments (requête rapide, insertion lente, modification et suppression des éléments)
Par rapport à LinkedList, il est efficace, mais en filetage.
ArrayList Array est un tableau mutable qui peut accéder à tous les éléments, y compris null
L'implémentation sous-jacente se fait à l'aide de tableaux
objet transitoire [] elementData;
Méthode de construction
private static final int default_capacity = 10; objet final statique privé [] vide_elementData = {}; objet final statique privé [] defaultcapacity_empty_elementData = {}; objet transitoire [] elementData; private int size; // Construire une liste de liste vide ArrayList () {this.elementData = defaultCapacity_empty_elementData; } // Construisez une liste vide de la capacité initiale spécifiée ArrayList (int initialCapacity) {if (initialCapacity> 0) {this.elementData = new Object [initialCapacity]; } else if (initialCapacity == 0) {this.elementData = vide_elementData; } else {lance un nouveau IllégalArgumentException ("Capacité illégale:" + InitialCapacity); }} // Construisez une liste d'éléments de collecte spécifiés, qui sont organisés dans l'ordre de retour itératif des éléments de connexion publique ArrayList (collection <? Étend e> c) {elementData = c.toarray (); if ((size = elementData.Length)! = 0) {// C.ToArray pourrait (incorrectement) non retour objet [] (voir 6260652) if (elementData.getClass ()! = objet []. class) elementData = arrays.copyof (elementData, size, objet []. class); } else {// Remplacez par un tableau vide. this.elementData = vide_elementData; }}stockage
// L'élément à la position spécifiée de la liste est remplacé par l'élément, et l'élément d'origine à cette position est renvoyé public E Set (int index, e élément) {RangECHeck (index); // Vérifiez la capacité et le lancer du tableau: indexoutofboundSexception e oldvalue = elementData (index); elementData [index] = élément; Retour OldValue; } // Ajouter l'élément spécifié à la fin de la liste publique Boolean Add (e e) {assurecapacityInternal (taille + 1); // Extension du tableau ElementData [Size ++] = E; Retour Vrai; } // Ajouter l'élément à la position spécifiée de la liste publique Boolean add (e e) {assurecapacityInternal (size ++] = e; return true;} // ajouter l'élément à la position spécifiée de la liste publique void add (int index, e élément) {RangeCheckForAddd (index); AssurecapacityInternal (size + 1); // augmente modCount !! // srrc: Source Arry,, TIME + 1); // augmente modCount !! // srrc: Source Arry, Fray,, 1); // Incression ModCount !! SRCPRO: Position de démarrage dans le tableau source // DEST: TABLEAU DE DÉSINGE, Poste de démarrage du tableau cible, Longueur: Nombre d'éléments de tableau à copier // Déplacez les éléments actuellement à cette position et tous les éléments suivants, index, index; Ajouter les éléments dans la connexion à la fin de la liste, et les éléments sont dans l'ordre renvoyé par l'itérateur de connexion Boolean Addall (Collection <? Étend E> C) {objet [] A = C.ToArray (); 0, élémentdata, taille, numnew); ENSURECAPACE INSTRAUX (taille + numNew);Lire
// Supprime l'élément à la position spécifiée de cette liste publique E Remover (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; // clair pour laisser GC faire son travail renvoie OldValue; } // Supprime un élément dans cette liste publique booléen supprime (objet o) {if (o == null) {for (int index = 0; index <size; index ++) if (elementData [index] == null) {fastRemove (index); Retour Vrai; }} else {for (int index = 0; index <size; index ++) if (o.equals (elementData [index])) {fastRemove (index); Retour Vrai; }} return false; } 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; // clair pour laisser GC faire son travail}Extension du tableau
Chaque fois qu'un élément est ajouté à un tableau, il est nécessaire de vérifier si le nombre d'éléments dépasse la longueur du tableau actuel après avoir ajouté des éléments. S'il dépasse la longueur, le tableau sera élargi pour répondre aux besoins de l'ajout de données.
public void assurecapacity (int mincapacity) {int minexpand = (elementData! = defaultCapacity_empty_elementData)? 0: default_capacity; if (mincapacity> minexpand) {assurexplicitCapacity (mincapacity); }} private void assurecapacityInternal (int mincapacity) {if (elementData == defaultcapacity_empty_elementData) {mincapacity = math.max (default_capacity, minecacity); } assure lacapacité (mincapacité); } private void assureExplicitCapacity (int mincapacity) {modCount ++; // code consciente du trop-plein if (mincapacity - elementData.length> 0) se développer (mincapacité); } private void Grow (int Mincapacity) {// Code de trop-flux int Int OldCapacity = elementData.Length; int newcapacity = oldcapacity + (oldcapacity >> 1); if (newcapacity - mincapacity <0) newCapacity = mincapacity; if (newCapacity - max_array_size> 0) newCapacity = HugeCapacity (mincapacity); // La mincapacité est généralement proche de la taille, il s'agit donc d'une victoire: elementData = arrays.copyof (elementData, newcapacity); } private static int HugeCapacity (int mincapacity) {if (mincapacity <0) // débordement de débordement new outofMemoryError (); return (mincapacity> max_array_size)? Integer.max_value: max_array_size; }ArrayList manuscrit
classe publique MyArrayList / * implémente List <e> * / {Private Transient Object [] ElementData; Taille INT privée; // Nombre d'éléments public MyArrayList () {this (10); } public MyArrayList (int initialCapacity) {if (initialCapacity <0) {try {throw new exception (); } catch (exception e) {e.printStackTrace (); }} elementData = nouvel objet [initialCapacity]; } public int size () {return size; } public boolean isEmpty () {return size == 0; } // Supprimer l'objet en fonction de l'index public void supprime (int index) lève exception {rangeCheck (index); int numMoved = size-index-1; if (numMoved> 0) {System.ArrayCopy (elementData, index + 1, elementData, index, numMoved); } elementData [- size] = null; } // Supprimer l'objet public booléen retire (objet obj) lève une exception {pour (int i = 0; i <size; i ++) {if (get (i) .equals (obj)) {retire (i); } return true; } return true; } // Modifier le set d'objets publics de l'élément (int index, objet obj) lève exception {rangeCheck (index); Objet OldValue = elementData [index]; elementData [index] = obj; Retour OldValue; } // Insérez l'élément à la position spécifiée publique void add (int index, objet obj) lève une exception {rangeCheck (index); Assurecapacity (); System.ArrayCopy (élémentData, index, elementData, index + 1, taille-index); elementData [index] = obj; taille ++; } public void add (objet objet) {Assurecapacity (); / * elementData [size] = objet; size ++; * / elementData [size ++] = objet; // Attribuez une valeur d'abord, puis augmentez-vous} objet public get (int index) lève une exception {rangeCheck (index); return elementData [index]; } public void RangECheck (int index) lève une exception {if (index <0 || index> = size) {throw new exception (); }} // Développez public void assurecapacity () {// Expansion du tableau et copie de contenu if (size == elementData.length) {// elementData = nouvel objet [size * 2 + 1]; Écrivez de cette façon le contenu dans le tableau d'origine est l'objet perdu [] newArray = nouvel objet [taille * 2 + 1]; // Copiez le contenu dans le tableau / * pour (int i = 0; i <newarray.length; i ++) {newArray [i] = elementData [i]; } * / System.ArrayCopy (ElementData, 0, NewArray, 0, ElementData.Length); elementData = newArray; }} // Tester public static void main (String [] args) {MyArrayList MyArrayList = new MyArrayList (3); MyArrayList.add ("111"); MyArrayList.add ("222"); MyArrayList.add ("333"); MyArrayList.add ("444"); MyArrayList.add ("555"); essayez {myArrayList.Remove (2); MyArrayList.add (3, "Nouvelle valeur"); MyArrayList.set (1, "modifier"); } catch (exception e1) {// TODO Bloc de capture généré automatiquement e1.printStackTrace (); } System.out.println (MyArrayList.size ()); for (int i = 0; i <myArrayList.size (); i ++) {try {System.out.println (MyArrayList.get (i)); } catch (exception e) {e.printStackTrace (); }}}}