JavaRush /Blog Java /Random-FR /Classe ArrayList en Java

Classe ArrayList en Java

Publié dans le groupe Random-FR
Bonjour! Dans les conférences précédentes, nous avons examiné en détail une structure de données telle qu'un tableau et examiné des exemples courants de travail avec eux. Mais cette structure de données présente un certain nombre d'inconvénients. La réponse à ces problèmes en Java a été l'apparition d'ArrayList. Pour le dire le plus simplement possible, une ArrayList en Java est un tableau « mis à niveau » avec de nombreuses nouvelles fonctionnalités.Classe TableauListe - 1

En quoi Java Arraylist est-il différent des tableaux classiques ?

En général, les tableaux sont assez pratiques et, comme vous l'avez déjà remarqué, vous pouvez faire beaucoup de choses avec eux :) Cependant, les tableaux présentent également un certain nombre d'inconvénients.
  • Taille limitée. Vous devez déjà savoir au stade de la création d'un tableau combien de cellules il doit contenir. Si vous sous-estimez la quantité requise, il n'y aura pas assez d'espace. Si vous le surestimez, le tableau restera à moitié vide, et ce n’est pas si grave. Après tout, il s'avère que vous lui allouerez également plus de mémoire que nécessaire.
  • Un tableau n'a pas de méthode pour ajouter des éléments. Vous devez toujours spécifier explicitement l'index de la cellule où vous souhaitez ajouter l'élément. Si vous spécifiez accidentellement une cellule déjà occupée avec une valeur souhaitée, elle sera écrasée.
  • Il n’existe aucune méthode pour supprimer un élément. La valeur ne peut être « remise à zéro ».
public class Cat {

   private String name;

   public Cat(String name) {
       this.name = name;
   }

   public static void main(String[] args) {

       Cat[] cats = new Cat[3];
       cats[0] = new Cat("Thomas");
       cats[1] = new Cat("Hippopotamus");
       cats[2] = new Cat("Philip Markovich");

       cats[1] = null;



       System.out.println(Arrays.toString(cats));
   }

   @Override
   public String toString() {
       return "Cat{" +
               "name='" + name + '\'' +
               '}';
   }
}
Conclusion:

[Cat{name='Томас'}, null, Cat{name='Фorпп Маркович'}]
Toutes ces lacunes peuvent être éliminées à l'aide d'ArrayList. Il se crée très simplement :
ArrayList<Cat> cats = new ArrayList<Cat>();
Nous avons maintenant créé une liste pour stocker les objets Cat. Faites attention:nous ne spécifions pas la taille de l'ArrayList car elle est automatiquement extensible. Comment est-ce possible? Facilement. Vous serez surpris, mais ArrayList est basé sur un tableau ordinaire :) Oui, à l'intérieur se trouve un tableau dans lequel nos éléments sont stockés. Mais ArrayList dispose d'un mécanisme spécial pour travailler avec :
  • Lorsque ce tableau interne est plein, ArrayList crée un nouveau tableau en lui-même. Sa taille = (taille de l'ancien tableau * 1,5) +1.
  • Toutes les données sont copiées de l'ancien tableau vers le nouveau
  • L'ancien tableau est supprimé par le garbage collector.
Grâce à ce mécanisme, une ArrayList (par opposition à un tableau) implémente une méthode pour ajouter un nouvel élément. C'est une méthode add().
public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<Cat>();
   cats.add(new Cat("Hippopotamus"));
}
Le nouvel élément est ajouté à la fin de la liste. Désormais, il n’y a aucun risque de débordement, ce mécanisme est donc totalement sécurisé. À propos, ArrayList peut non seulement rechercher un objet par index, mais aussi vice versa - il peut trouver l'index d'un objet dans ArrayList par référence à l'objet ! Pour cela, il implémente la méthode indexOf(): On lui passe un lien vers l'objet souhaité, et indexOf()il nous renvoie son index :
public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>();
   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Hippopotamus");
   Cat philipp = new Cat("Philip Markovich");
   Cat pushok = new Cat("Fluff");

   cats.add(thomas);
   cats.add(behemoth);
   cats.add(philipp);
   cats.add(pushok);

   int thomasIndex = cats.indexOf(thomas);
   System.out.println(thomasIndex);
}
Conclusion:

0
C'est vrai, l'objet thomasest en fait stocké dans la cellule 0. Les tableaux présentent non seulement des inconvénients, mais aussi des avantages incontestables. L'un d'eux recherche un élément par index. Puisque nous pointons vers un index, c’est-à-dire vers une adresse spécifique en mémoire, une telle recherche dans un tableau est très rapide. ArrayList en Java peut aussi le faire ! Pour ce faire, il implémente une méthode get():
public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>();
   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Hippopotamus");
   Cat philipp = new Cat("Philip Markovich");
   Cat pushok = new Cat("Fluff");

   cats.add(thomas);
   cats.add(behemoth);
   cats.add(philipp);
   cats.add(pushok);

   Cat secondCat = cats.get(1);

   System.out.println(secondCat);
}
Conclusion:

Cat{name='Бегемот'}
En outre, vous pouvez facilement savoir si une ArrayList contient ou non un objet particulier. Cela se fait en utilisant la méthode contains():
public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>();
   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Hippopotamus");
   Cat philipp = new Cat("Philip Markovich");
   Cat pushok = new Cat("Fluff");

   cats.add(thomas);
   cats.add(behemoth);
   cats.add(philipp);
   cats.add(pushok);

   cats.remove(pushok);
   System.out.println(cats.contains(pushok));
}
La méthode vérifie si l'élément est contenu dans le tableau interne d'ArrayList et renvoie le résultat sous la forme boolean- trueou false. Conclusion:

false
Et une autre chose importante concernant l'insertion. ArrayList vous permet d'insérer des données non seulement à la fin du tableau, mais également dans n'importe quelle cellule par index. Il dispose de deux méthodes pour cela :
  • add(int index, Cat element)
  • set(int index, Cat element)
Aux deux, vous transmettez l'index de la cellule dans laquelle vous souhaitez insérer et un lien vers l'objet lui-même. La différence est que le collage set()écrase l’ancienne valeur stockée dans la cellule. Et l'insertion en add()premier décale tous les éléments de [index]la fin du tableau et ajoute l'objet dont vous avez besoin à la cellule vide résultante. Voici un exemple :
public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>();
   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Hippopotamus");
   Cat philipp = new Cat("Philip Markovich");
   Cat pushok = new Cat("Fluff");

   cats.add(thomas);
   cats.add(behemoth);

   System.out.println(cats.toString());

   cats.set(0, philipp);//Now we have a list of 2 cats. We add the 3rd via set:

   System.out.println(cats.toString());
}
Conclusion:

[[Cat{name='Томас'}, Cat{name='Бегемот'}]
[Cat{name='Фorпп Маркович'}, Cat{name='Бегемот'}]
Nous avions une liste de 2 chats, nous en avons inséré un autre via la méthode set()dans la cellule 0. En conséquence, l’ancienne valeur stockée dans cette cellule a été remplacée par une nouvelle.
public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>();
   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Hippopotamus");
   Cat philipp = new Cat("Philip Markovich");
   Cat pushok = new Cat("Fluff");

   cats.add(thomas);
   cats.add(behemoth);

   System.out.println(cats.toString());

   cats.add(0, philipp);//Now we have a list of 2 cats. Add the 3rd via add

   System.out.println(cats.toString());
}
Mais cela add()a fonctionné différemment. Il a déplacé tous les éléments vers la droite puis a écrit la nouvelle valeur dans la cellule 0. Conclusion:

[Cat{name='Томас'}, Cat{name='Бегемот'}]
[Cat{name='Фorпп Маркович'}, Cat{name='Томас'}, Cat{name='Бегемот'}]
Pour effacer complètement la liste, utilisez la méthode clear():
public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>();
   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Hippopotamus");
   Cat philipp = new Cat("Philip Markovich");
   Cat pushok = new Cat("Fluff");

   cats.add(thomas);
   cats.add(behemoth);
   cats.add(philipp);
   cats.add(pushok);

   cats.clear();

   System.out.println(cats.toString());
}
Conclusion:

[]
Tout le contenu a été supprimé de la liste. Au fait, faites attention : contrairement aux tableaux, dans ArrayList, la méthode toString() est remplacée et affiche immédiatement la liste au format chaîne. Dans le cas des tableaux, nous avons dû utiliser pour cela la classe Arrays. Et puisque nous nous sommes souvenus des Arrays : en Java, vous pouvez facilement « basculer » entre un tableau et une ArrayList, c'est-à-dire convertir l'un en l'autre. La classe Arrays a une méthode pour cela, Arrays.asList(). Avec son aide, nous obtenons le contenu du tableau sous forme de liste et le transmettons au constructeur de notre ArrayList :
public static void main(String[] args) {

   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Hippopotamus");
   Cat philipp = new Cat("Philip Markovich");
   Cat pushok = new Cat("Fluff");

   Cat[] catsArray = {thomas, behemoth, philipp, pushok};

   ArrayList<Cat> catsList = new ArrayList<>(Arrays.asList(catsArray));
   System.out.println(catsList);
}
Conclusion:

[Cat{name='Томас'}, Cat{name='Бегемот'}, Cat{name='Фorпп Маркович'}, Cat{name='Пушок'}]
Vous pouvez faire le contraire : obtenir un tableau à partir d'un objet ArrayList. Pour ce faire, utilisez la méthode toArray() :
public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>();

   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Hippopotamus");
   Cat philipp = new Cat("Philip Markovich");
   Cat pushok = new Cat("Fluff");

   cats.add(thomas);
   cats.add(behemoth);
   cats.add(philipp);
   cats.add(pushok);

   Cat[] catsArray = cats.toArray(new Cat[0]);

   System.out.println(Arrays.toString(catsArray));
}
Attention : nous avons passé un tableau vide à la méthode toArray(). Ce n'est pas une erreur. Dans la classe ArrayList, cette méthode est implémentée de telle manière que le passage d'un tableau vide augmente ses performances. Pour l'instant, rappelez-vous simplement cela pour le futur (mais vous pouvez aussi transférer une taille spécifique, cela fonctionnera). En parlant de taille. La taille actuelle de la liste peut être trouvée en utilisant la méthode size():
public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>();


   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Hippopotamus");
   Cat philipp = new Cat("Philip Markovich");
   Cat pushok = new Cat("Fluff");

   cats.add(thomas);
   cats.add(behemoth);
   cats.add(philipp);
   cats.add(pushok);

   System.out.println(cats.size());
}
Il est important de comprendre ici que contrairement à la lengthpropriété array, la méthode ArrayList.size() renvoie exactement le nombre d'éléments, et non la capacité initiale, car nous ne le précisons pas lors de la création de l'ArrayList. D'ailleurs, il est généralement possible de l'indiquer. ArrayList a un constructeur correspondant. Mais son comportement en termes d’ajout de nouveaux éléments ne changera pas :
public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>(2);//create an ArrayList with an initial capacity of 2


   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Hippopotamus");
   Cat philipp = new Cat("Philip Markovich");
   Cat pushok = new Cat("Fluff");

   cats.add(thomas);
   cats.add(behemoth);
   cats.add(philipp);
   cats.add(pushok);

   System.out.println(cats.size());
}
Sortie de la console :

4
Nous avons créé une liste avec 2 éléments, mais lorsque nous en avions besoin, elle s'étendait facilement. Une autre chose est que si nous créons initialement une très petite liste, elle devra effectuer l'opération d'expansion plus souvent, ce qui consomme une certaine quantité de ressources. Dans cette conférence, nous avons à peine abordé le processus de suppression d'éléments d'une ArrayList. Bien entendu, cela n’est pas dû à un oubli. Ce sujet a été séparé dans une conférence distincte, que vous pouvez lire plus loin :)
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION