Je suis comme écrire un processus qui ne cesse de s’augmenter (liste) dans une boucle de liste en Java (au travail) »

I "Voulez-vous l'essayer?"

List<String> list = new ArrayList<>(Arrays.asList("foo", "hoo", "hoge"));
for (String str : list) {
    list.add(str);
}
System.out.println(list);

//Il y a une exception
// Exception in thread "main" java.util.ConcurrentModificationException
// 	at java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1042)
// 	at java.base/java.util.ArrayList$Itr.next(ArrayList.java:996)

I "ConcurrentModificationException?" Je "__ Qui êtes-vous __" "Voulez-vous l'essayer avec for Each?"

list.stream().forEach(list::add);
System.out.println(list);
// Exception in thread "main" java.util.ConcurrentModificationException
// 	at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1660)
//	at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:658)

Je "Non ..." J'ai dit: "Si tel est le cas, je vais faire Siesta après le déjeuner, qui est déjà endormi." Je "Oh ..." Chef d'équipe "sig-kun" Chef d'équipe "Je vous ai posé des questions sur l'enquête le matin, avez-vous compris quelque chose?" Je "Leader ...!" Je "(je ne l'ai pas fait)" Je "(Pour le moment __ j'ai l'impression de faire du travail __ je vous ai montré l'écran actuel pour l'obtenir)" J'aime ça" Chef d'équipe "Comment ..." Chef d'équipe "Cette exception appelée ConcurrentModificationException se produit lorsque [__ lorsque le nombre d'éléments de la liste d'origine est modifié pendant le traitement itératif__]." Chef d'équipe "L'itérateur Java enregistre en interne le nombre de fois que __ a changé sa propre structure avec le nom de variable modCount, et lève une exception si une divergence est trouvée lors du traitement répété pour ce nombre de changements. Ça devient "

Exemple: implémentation d'ArrayList



//modCount avec add(Nombre de changements)Est mis à jour
public boolean add(E e) {
    modCount++;
    add(e, elementData, size);
    return true;
}

// modCount(Nombre de changements)Vérification de=>Lancer une exception s'il y a un espace
final void checkForComodification() {
    if (modCount != expectedModCount)
        throw new ConcurrentModificationException();
}

//Vérifiez le nombre de changements à chaque fois que vous passez à la boucle suivante
public E next() {
    checkForComodification();  // modCount(Nombre de changements)La vérification est effectuée
    int i = cursor;
    if (i >= size)
        throw new NoSuchElementException();
    Object[] elementData = ArrayList.this.elementData;
    if (i >= elementData.length)
        throw new ConcurrentModificationException();
    cursor = i + 1;
    return (E) elementData[lastRet = i];
}

Je "Oh" I "Pourquoi tu te donnes la peine de faire ça?" Chef d'équipe "De nombreuses collections Java utilisent Failfast" Je "Failfast?" Chef d'équipe "C'est une canne qui ne tombe pas. Avant qu'elle échoue, elle jette une exception lorsqu'elle détecte un danger." Chef d'équipe "Parce que Java dit en gros qu'il ne garantit pas la réécriture de la structure des collections en multithreading." Chef d'équipe "Cette fois, il s'agissait d'un thread unique, mais j'essaie d'abord de lancer une exception pour que ce soit bien si c'est multi-thread." Je "je vois" Je suis un gars prudent ... Chef d'équipe "Au fait, si vous modifiez la structure de l'extérieur de l'itérateur, elle sera supprimée, mais vous pouvez la suivre de l'intérieur de l'itérateur __"

Ajouter depuis l'intérieur de l'itérateur


List<String> list = new ArrayList<>(Arrays.asList("foo", "hoo", "hoge"));
for (ListIterator<String> itr = list.listIterator(); itr.hasNext();) {
    String str = itr.next();
    itr.add(str + "_itr");
}
System.out.println(list);
// [foo, foo_itr, hoo, hoo_itr, hoge, hoge_itr]

I "Leader, __ je ne suis pas dans une boucle infinie __" Je "(je veux jouer en regardant le tableau de plus en plus grand jusqu'à l'heure fixée ...)" Chef d'équipe "Parce que l'élément ajouté par ListIterator.add est inséré juste avant __next de l'itérateur." Chef d'équipe "N'affecte pas les hasNext () ou next () suivants" Je sérieusement)" Chef d'équipe "Je préfère le dire bientôt" Chef d'équipe "Ce __ n'a rien à voir avec le travail " Chef d'équipe "Avez-vous fait le sondage que vous avez demandé?" Je " (ne pas faire) " Chef d'équipe "Je comprends" Chef d'équipe "Il y a des emplois sans fin, donc pour sig-kun, qui semble être libre pour le moment, ceci et cela cette semaine ..." Je "chef!" Chef d'équipe "Quoi" Je " Je pars tôt parce que j'ai senti le danger " I « Failfast Return Home __» Chef d'équipe "Travaillez parce que ça va"

Résumé approximatif: Qu'est-ce que ConcurrentModificationException?

Recommended Posts

Je suis comme écrire un processus qui ne cesse de s’augmenter (liste) dans une boucle de liste en Java (au travail) »
Créer une SkipList nommée en Java qui ressemble à un ensemble trié redis
J'ai écrit une sorte de livre qui ressemble à Java
Implémenter quelque chose comme une pile en Java
Traitez n'importe quel nombre de cas dans la liste Java
Un fichier bat qui utilise Java dans Windows
[Java] Exécuter un processus spécifique dans un autre thread avec Executor Service [Eviter une boucle infinie]