Ajout d'un élément à un tableau Java par rapport à un ArrayList

1. Vue d'ensemble

Dans ce didacticiel, nous examinerons brièvement les similitudes et les différences d'allocation de mémoire entre les tableaux Java et la ArrayList standard . De plus, nous verrons comment ajouter et insérer des éléments dans un tableau et ArrayList .

2. Tableaux Java et ArrayList

Un tableau Java est une structure de données de base fournie par le langage. En revanche, ArrayList est une implémentation de l' interface List soutenue par un tableau et est fournie dans Java Collections Framework.

2.1. Accès et modification des éléments

Nous pouvons accéder et modifier les éléments du tableau en utilisant la notation entre crochets:

System.out.println(anArray[1]); anArray[1] = 4;

D'autre part, ArrayList dispose d'un ensemble de méthodes pour accéder et modifier les éléments:

int n = anArrayList.get(1); anArrayList.set(1, 4);

2.2. Taille fixe vs dynamique

Un tableau et ArrayList allouent tous deux la mémoire du tas de manière similaire, mais ce qui diffère, c'est qu'un tableau est de taille fixe, tandis que la taille d'un ArrayList augmente dynamiquement.

Comme un tableau Java est de taille fixe, nous devons fournir la taille lors de son instanciation. Il n'est pas possible d'augmenter la taille du tableau une fois qu'il a été instancié. Au lieu de cela, nous devons créer un nouveau tableau avec la taille ajustée et copier tous les éléments du tableau précédent.

ArrayList est une implémentation de tableau redimensionnable de l' interface List , c'est-à-dire qu'ArrayList se développe de manière dynamique à mesure que des éléments y sont ajoutés. Lorsque le nombre d'éléments actuels (y compris le nouvel élément à ajouter à ArrayList ) est supérieur à la taille maximale de son tableau sous-jacent, alors ArrayList augmente la taille du tableau sous-jacent.

La stratégie de croissance du tableau sous-jacent dépend de l'implémentation de ArrayList . Cependant, étant donné que la taille du tableau sous-jacent ne peut pas être augmentée dynamiquement, un nouveau tableau est créé et les anciens éléments du tableau sont copiés dans le nouveau tableau.

L'opération d'ajout a un coût en temps amorti constant. En d'autres termes, l'ajout de n éléments à une ArrayList nécessite un temps O (n) .

2.3. Types d'élément

Un tableau peut contenir des types de données primitifs et non primitifs, selon la définition du tableau. Cependant, une ArrayList ne peut contenir que des types de données non primitifs .

Lorsque nous insérons des éléments avec des types de données primitifs dans une ArrayList , le compilateur Java convertit automatiquement le type de données primitif en sa classe d'encapsuleur d'objet correspondante.

Voyons maintenant comment ajouter et insérer des éléments dans les tableaux Java et ArrayList .

3. Ajout d'un élément

Comme nous l'avons déjà vu, les tableaux sont de taille fixe.

Donc, pour ajouter un élément, nous devons d'abord déclarer un nouveau tableau plus grand que l'ancien tableau et copier les éléments de l'ancien tableau dans le tableau nouvellement créé. Après cela, nous pouvons ajouter le nouvel élément à ce tableau nouvellement créé.

Regardons son implémentation en Java sans utiliser de classes utilitaires:

public Integer[] addElementUsingPureJava(Integer[] srcArray, int elementToAdd) { Integer[] destArray = new Integer[srcArray.length+1]; for(int i = 0; i < srcArray.length; i++) { destArray[i] = srcArray[i]; } destArray[destArray.length - 1] = elementToAdd; return destArray; }

Alternativement, la classe Arrays fournit une méthode utilitaire copyOf () , qui aide à créer un nouveau tableau de plus grande taille et à copier tous les éléments de l'ancien tableau:

int[] destArray = Arrays.copyOf(srcArray, srcArray.length + 1);

Une fois que nous avons créé un nouveau tableau, nous pouvons facilement ajouter le nouvel élément au tableau:

destArray[destArray.length - 1] = elementToAdd;

D'un autre côté, ajouter un élément dans ArrayList est assez simple :

anArrayList.add(newElement);

4. Insertion d'un élément à l'index

Insérer un élément à un index donné sans perdre les éléments précédemment ajoutés n'est pas une tâche simple dans les tableaux.

Tout d'abord, si le tableau contient déjà le nombre d'éléments égal à sa taille, nous devons d'abord créer un nouveau tableau avec une taille plus grande et copier les éléments dans le nouveau tableau.

De plus, nous devons décaler tous les éléments qui viennent après l'index spécifié d'une position vers la droite:

public static int[] insertAnElementAtAGivenIndex(final int[] srcArray, int index, int newElement) { int[] destArray = new int[srcArray.length+1]; int j = 0; for(int i = 0; i < destArray.length-1; i++) { if(i == index) { destArray[i] = newElement; } else { destArray[i] = srcArray[j]; j++; } } return destArray; }

Cependant, la classe ArrayUtils nous offre une solution plus simple pour insérer des éléments dans un tableau :

int[] destArray = ArrayUtils.insert(2, srcArray, 77);

Nous devons spécifier l'index auquel nous voulons insérer la valeur, le tableau source et la valeur à insérer.

La méthode insert () renvoie un nouveau tableau contenant un plus grand nombre d'éléments, avec le nouvel élément à l'index spécifié et tous les éléments restants décalés d'une position vers la droite.

Notez que le dernier argument de la méthode insert () est un argument variable, nous pouvons donc insérer n'importe quel nombre d'éléments dans un tableau.

Utilisons-le pour insérer trois éléments dans srcArray à partir de l'index deux:

int[] destArray = ArrayUtils.insert(2, srcArray, 77, 88, 99);

Et les éléments restants seront déplacés de trois endroits vers la droite.

De plus, cela peut être réalisé de manière triviale pour ArrayList :

anArrayList.add(index, newElement);

ArrayList décale les éléments et insère l'élément à l'emplacement requis.

5. Conclusion

Dans cet article, nous avons examiné le tableau Java et ArrayList . De plus, nous avons examiné les similitudes et les différences entre les deux. Enfin, nous avons vu comment ajouter et insérer des éléments dans un tableau et ArrayList .

Comme toujours, le code source complet des exemples de travail est disponible à l'adresse over sur GitHub.