Sobes.tech
Middle

Πώς θα συμπεριφερθεί ένας instantiated iterator για μια συλλογή αν καλέσουμε τη μέθοδο collection.remove();

sobes.tech AI

Απάντηση από AI

Η κλήση του collection.remove() κατά τη διάρκεια της επανάληψης με έναν instantiated iterator μπορεί να οδηγήσει σε ConcurrentModificationException.

Αυτό συμβαίνει επειδή ο iterator συνήθως δεν γνωρίζει τις αλλαγές που γίνονται στη βασική συλλογή απευθείας από έξω από τον iterator. Ο iterator διατηρεί μια εσωτερική κατάσταση (π.χ. το δείκτη του τρέχοντος στοιχείου), η οποία γίνεται μη έγκυρη αν η συλλογή τροποποιηθεί εκτός των μεθόδων του iterator (iterator.remove()).

Μερικές υλοποιήσεις συλλογών μπορεί να είναι "fail-fast" και να ρίχνουν συγκεκριμένα ConcurrentModificationException όταν ανιχνεύουν τέτοιες αλλαγές, για να αποφευχθεί η απρόβλεπτη συμπεριφορά.

Ο μόνος ασφαλής τρόπος για να τροποποιήσετε τη συλλογή κατά τη διάρκεια της επανάληψης είναι να χρησιμοποιήσετε τη μέθοδο iterator.remove().

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class IteratorModificationExample {

    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("A");
        list.add("B");
        list.add("C");

        Iterator<String> iterator = list.iterator();

        while (iterator.hasNext()) {
            String element = iterator.next();
            if ("B".equals(element)) {
                // Αυτό θα προκαλέσει `ConcurrentModificationException`
                 // list.remove(element);

                // Ασφαλής τρόπος διαγραφής
                 iterator.remove();
            }
        }

        System.out.println(list);
    }
}