[JAVA] Le comportement est différent entre new et clear () de ArrayList

J'en suis accro.

introduction

Lorsqu'il s'agit de listes en Java, je pense que j'utilise souvent ArrayList comme nouveau.

hoge.java


List<String> list = new ArrayList<>();

Lorsque j'ai demandé à un enseignant de Google quand je voulais réutiliser la ArrayList,

  1. nouveau
  2. Utilisez la méthode ArrayList.clear ()

Je pense que deux méthodes sont recommandées. Et je ne mentionne pas la différence entre les deux, et je pense que l'article de Qiita sera un succès, disant "La vitesse d'exécution est différente".

Cependant, en réalité, il existe des différences non seulement de vitesse mais aussi de comportement.

Différence entre nouveau et clair ()

Supposons que vous souhaitiez créer une liste bidimensionnelle en extrayant deux éléments de la liste unidimensionnelle.

L'exemple de code est illustré ci-dessous. Tout d'abord, c'est du cas du neuf.

sample.java


import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class TestArraylist {
    public static void main(String args[]) {
        //Liste bidimensionnelle pour la sortie
        List<ArrayList<String>> sampleLists = new ArrayList<>();
        //Liste temporaire pour ajouter des éléments à sampleLists
        ArrayList<String> listA = new ArrayList<>();
        //Échantillon approprié
        List<String> listB = Arrays.asList("AA", "BB", "CC", "DD", "EE", "FF");

        //Créez une liste avec 2 éléments et ajoutez-la à sampleLists
        for (int i = 0; i < listB.size(); i++) {
            if (i % 2 == 0) {
                listA.add(listB.get(i));
                continue;
            }
            sampleLists.add(listA);
            listA.add(listB.get(i));
            //Confirmation avant nouveau
            System.out.println(sampleLists);

            //Nouvelle liste temporaire
            listA = new ArrayList<>();
            //Confirmation après nouveau
            System.out.println(sampleLists);
        }
    }
}

Quand vous faites cela ...

[[AA, BB]]
[[AA, BB]]
[[AA, BB], [CC, DD]]
[[AA, BB], [CC, DD]]
[[AA, BB], [CC, DD], [EE, FF]]
[[AA, BB], [CC, DD], [EE, FF]]

Vous pouvez voir que la liste est exactement ce que vous voulez.

D'un autre côté, supposons que vous utilisiez la méthode clear au lieu de new. La sortie lorsque listA = new ArrayList <> (); dans l'exemple ci-dessus est réécrit dans le code listA.clear (); en utilisant la méthode clear est ...

[[AA, BB]]
[[]]
[[CC, DD], [CC, DD]]
[[], []]
[[EE, FF], [EE, FF], [EE, FF]]
[[], [], []]

De cette façon, ** l'élément qui aurait dû être ajouté sera une liste de l'élément 0 à chaque fois que la méthode clear est appelée, et l'élément nouvellement ajouté sera ajouté à toutes les listes jusqu'au prochain appel à la méthode clear. Masu **.

en conclusion

Quand j'essaye de google, il y a beaucoup de pages qui disent laquelle peut être utilisée pour effacer les éléments du tableau, donc je ne fais pas attention, mais en réalité il se comporte différemment comme décrit ci-dessus, alors soyez prudent.

Recommended Posts

Le comportement est différent entre new et clear () de ArrayList
Le contenu de la valeur de retour de executeBatch est différent entre 11g et 12c
Différence entre ArrayList et LinkedList
Différence entre List et ArrayList
Les débutants en Java ont brièvement résumé le comportement de Array et ArrayList
[Java] Différence entre array et ArrayList
À propos de removeAll et de retentionAll de ArrayList
[Rails] Différence de comportement entre delegate et has_many-through dans le cas de one-to-one-to-many
Différence entre la préface et le suffixe des opérateurs
Différence entre isEmpty et isBlank de StringUtils
Différence entre EMPTY_ELEMENTDATA et DEFAULTCAPACITY_EMPTY_ELEMENTDATA dans ArrayList
Quelle est la différence entre SimpleDateFormat et DateTimeFormatter? ??
java.util.Arrays.asList () ne remplace pas le nouveau ArrayList <> ()
Différence entre le membre et la collection de rails routes.rb
[Rails] Différence entre la méthode de création et la méthode nouvelle + sauvegarde
Existe-t-il une différence de performances entre Oracle JDK et OpenJDK à la fin de 2017?