web-dev-qa-db-fra.com

Comment fonctionne ArrayList?

Quelle structure de données est utilisée par ArrayList en interne?

29
AutoMEta

En interne, ArrayList utilise un Object[].

Lorsque vous ajoutez des éléments à une ArrayList, la liste vérifie si le tableau de sauvegarde a de la place. S'il y a de la place, le nouvel élément est ajouté à l'espace vide suivant. S'il n'y a pas de place, un nouveau tableau plus grand est créé et l'ancien tableau est copié dans le nouveau.

Maintenant, il reste plus de place et le nouvel élément est ajouté dans le prochain espace vide.

Puisque les gens aiment vraiment le code source:

/**
 * The array buffer into which the elements of the ArrayList are stored.
 * The capacity of the ArrayList is the length of this array buffer.
 */
private transient Object[] elementData;

Tout droit sorti du JDK.

58
jjnguy

Il utilise un Object[] et crée un tableau plus grand lorsque le tableau est plein.

Vous pouvez lire le code source ici .

19
SLaks

ArrayList utilise un tableau d'objets pour stocker les données en interne.

Lorsque vous initialisez une ArrayList, un tableau de taille 10 ( default capacity ) est créé et un élément ajouté à ArrayList est ajouté à ce tableau. 10 est la taille par défaut et peut être passé en paramètre lors de l'initialisation de ArrayList.

Lors de l'ajout d'un nouvel élément, si le tableau est plein, un nouveau tableau de 50% plus la taille initiale est créé et le dernier tableau est copié dans ce nouveau tableau afin qu'il y ait maintenant des espaces vides pour le nouvel élément à ajouter.

Étant donné que la structure de données sous-jacente utilisée est un tableau, il est assez facile d'ajouter un nouvel élément à ArrayList à mesure qu'il est ajouté à la fin de la liste. Quand un élément doit être ajouté n'importe où ailleurs, dites le début, tous les éléments devront alors se déplacer d'une position vers la droite pour créer un espace vide au début du nouvel élément à ajouter. Ce processus prend prend beaucoup de temps (temps linéaire) . Mais l’avantage de ArrayList est que récupérer un élément à n’importe quelle position est très rapide (temps constant) , étant donné qu’il utilise simplement un tableau d’objets.

8
kapil

ArrayLists utilise des tableaux pour stocker les données. Une fois que le nombre d'éléments dépasse le tableau alloué, il copie les données dans un autre tableau, doublant probablement la taille.

Un impact (mineur) sur les performances est pris lors de la copie du tableau, il est donc possible de définir la taille du tableau interne dans le constructeur de la liste.

De plus, il implémente Java.util.Collection et and Java.util.list, il est donc possible d’obtenir l’élément à un index spécifié, et itérable (tout comme un tableau).

0
Jes

Il utilise un objet []. Lorsque le tableau est plein, il crée un nouveau tableau dont la taille est 50% plus grande et copie les éléments actuels dans le nouveau tableau. Cela se produit automatiquement. 

0
Krishna

Il utilise un tableau et quelques entiers pour indiquer la première valeur - dernier indice de valeur

private transient int firstIndex;

private transient int lastIndex;

private transient E[] array;

Voici un exemple de mise en œuvre.

0
Tom

En règle générale, les structures telles que ArrayLists sont implémentées par un bon vieux tableau défini dans la classe et non directement accessible en dehors de la classe. 

Une certaine quantité d’espace est initialement allouée à la liste et, lorsque vous ajoutez un élément dépassant la taille du tableau, celui-ci est réinitialisé avec une nouvelle capacité (généralement un multiple de la taille ré-allouez constamment des tableaux avec chaque nouvelle entrée ajoutée).

0
Ryan Brunner

Le code source de la plate-forme Java est disponible gratuitement. Voici un extrait:

public class ArrayList<E> extends AbstractList<E>
  implements List<E>, RandomAccess, Cloneable, Java.io.Serializable
{
  /**
   * The array buffer into which the elements of the ArrayList are stored.
   * The capacity of the ArrayList is the length of this array buffer.
   */
  private transient E[] elementData;
  .
  .
  .
}
0
John Topley