Il existe de nombreuses façons de traverser et de supprimer des éléments dans la liste ou la carte, et des problèmes surviendront lorsqu'ils seront utilisés mal. Apprenons de cet article ci-dessous.
1. Supprimer les éléments pendant la traversée de la liste
Utilisation de la traversée des indices d'index
Exemple: supprimer 2 dans la liste
public static void main (String [] args) {list <Integer> list = new ArrayList <Integer> (); list.add (1); list.add (2); list.add (2); list.add (3); list.add (4); for (int i = 0; i <list.size (); i ++) {if (2 == list.get (i)) {list.remove (i); } System.out.println (list.get (i)); } System.out.println ("list =" + list.toString ()); }Résultat de sortie:
1234List = [1, 2, 3, 4]
question:
Le résultat montre qu'un seul 2 a été supprimé et que les 2 autres ont été manqués. La raison en est: après avoir supprimé les 2 premiers, le nombre d'éléments dans l'ensemble est réduit de 1, et les éléments suivants sont avancés de 1 bit, ce qui entraîne le manque de 2 secondes.
Comment utiliser pour la traversée de boucle
Exemple:
public static void listIterator2 () {list <Integer> list = new ArrayList <Integer> (); list.add (1); list.add (2); list.add (2); list.add (3); list.add (4); for (int value: list) {if (2 == valeur) {list.reMove (valeur); } System.out.println (valeur); } System.out.println (valeur); } System.out.println ("list =" + list.toString ()); }résultat:
Exception dans Thread "Main" 12java.util.concurrentModificationException sur java.util.arraylist $ ittr.checkforomodification (source inconnue) sur java.util.arraylist $ ittr.next (source inconnue) sur test.listiterator.listiterator2 (listerator.java:39) at test.listiterator.main (listerator.java:10) at test.listiterator.main (listerator
illustrer:
Description de la conception de laModification Concurrent dans JDK:
public class ConcurrentModificationException extends
RuntimeException Cette exception est lancée lorsque la méthode détecte la modification simultanée de l'objet mais ne permet pas une telle modification.
Par exemple, lorsqu'un thread itère sur une collection, une autre modification linéaire n'est généralement pas autorisée à être effectuée. Habituellement, dans ces cas, les résultats de l'itération sont incertains. Si ce comportement est détecté, certaines implémentations itératives (y compris toutes les implémentations de la collection générale fournies par JRE) peuvent choisir de lancer cette exception. L'itérateur qui effectue cette opération est appelé un itérateur de défaillance rapide car l'itérateur échoue très rapidement sans risquer le risque de comportement incertain arbitraire à un moment donné à l'avenir.
Remarque : Cette exception n'indique pas toujours que l'objet a été modifié simultanément par un thread différent. Si un seul thread émet une séquence d'appels de méthode qui viole le contrat de l'objet, l'objet peut lancer cette exception. Par exemple, si un thread modifie directement la collection lorsque les itérations de la collection à l'aide d'un itérateur Fast Fail, l'itérateur lancera cette exception.
Remarque : Le comportement de défaillance rapide de l'itérateur ne peut pas être garanti, car en général, il est impossible de garantir des garanties difficiles pour savoir s'il existe des modifications simultanées hors synchrones. Une opération de défaillance rapide fera de son mieux pour lancer ConcurrentModificationException . Par conséquent, il est faux d'écrire un programme qui dépend de cette exception pour améliorer l'exactitude de ces opérations. La bonne façon est: ConcurrentModificationException doit être utilisée uniquement pour détecter les bogues.
Pour chacun de Java utilise réellement Iterator pour le traitement. L'itérateur ne permet pas de supprimer les collections pendant l'utilisation de l'itérateur. Cela fait que l'itérateur lance ConcurrentModificationException .
La bonne façon
Exemple:
public static void listIterator3 () {list <Integer> list = new ArrayList <Integer> (); list.add (1); list.add (2); list.add (2); list.add (3); list.add (4); Iterator <Integer> it = list.iterator (); while (it.hasnext ()) {entier valeur = it.next (); if (2 == valeur) {it.remove (); } System.out.println (valeur); } System.out.println (valeur); } System.out.println ("list =" + list.toString ()); }résultat:
12234List = [1, 3, 4]
2. Supprimer les éléments pendant la traversée de la carte
Exemples d'approche correcte:
public static void main (string [] args) {hashmap <string, string> map = new hashmap <string, string> (); map.put ("1", "test1"); map.put ("2", "test2"); map.put ("3", "test3"); map.put ("4", "test4"); // Traversal complet de MAP pour (entrée <chaîne, chaîne> Entrée: map.entryset ()) {System.out.printf ("Key:% S Valeur:% S / R / N", Entry.getKey (), Entry.GetValue ()); } // Supprimer l'élément iterator <map.entry <string, string >> it = map.entryset (). Iterator (); while (it.hasnext ()) {map.entry <string, string> entry = it.next (); String key = entry.getKey (); int k = Integer.ParseInt (clé); if (k% 2 == 1) {System.out.printf ("Delete Key:% s valeur:% s / r / n", key, entry.getValue ()); it.remove (); }} // map de traverse complète pour (entrée <string, string> entrée: map.entryset ()) {System.out.printf ("key:% s valeur:% s / r / n", entrée.getKey (), entry.getValue ()); }}résultat:
Clé: 1 Valeur: Test1Key: 2 Valeur: Test2Key: 3 Valeur: Test3Key: 4 Valeur: Test4Delete Key: 1 Valeur: Test1Delete Key: 3 Valeur: Test3Key: 2 Valeur: Test2Key: 4 Valeur: Test4
Avis
Mais il y a aussi des choses que nous devons prêter attention à remove() de l'itérateur:
La méthode remove() iterator.next() () est appelée.
Avant d'appeler la méthode remove() , next() doit être appelée une fois.
Description de la méthode supprime () dans JDK-API:
void remove() supprime le dernier élément renvoyé par l'itérateur de la collection pointé par l'itérateur (opération facultative). Cette méthode ne peut être appelée qu'une seule fois par appel. Si l'itérateur est modifié d'une manière autre que d'appeler cette méthode lors de l'itération, le comportement de l'itérateur est ambigu.
Lance: UnsupportedOperationException - Si l'itérateur ne prend pas en charge le fonctionnement remove . IllegalStateException - Si la méthode next n'a pas été appelée, ou si la méthode remove a été appelée après le dernier appel à la méthode next .
Résumer
Ce qui précède consiste à supprimer des éléments pendant la traversée de la liste et de la carte. J'espère que le contenu de cet article sera d'une aide à l'étude ou au travail de chacun. Si vous avez des questions, vous pouvez laisser un message pour communiquer.