PDA

View Full Version : [Java] Dubbio su Iterator


e-commerce84
20-05-2010, 15:59
Ciao,
mi stavo ripassando gli iteratori ma ho un dubbio...sono andato a vedere anche quì ma il dubbio permane:
http://java.sun.com/j2se/1.4.2/docs/api/java/util/Iterator.html

Il metodo remove() e la sua eventuale implementazione nell'iteratore di una mia particolare collezione che fà esattamente? Rimuove fisicamente l'oggetto dalla mia collezione che stò scorrendo con l'iteratore o cosa?

Grazie

deadlyomen17
20-05-2010, 16:33
il metodo remove su un iteratore invoca il metodo remove della collection sulla quale sta iterando, passandogli come argomento l'ultimo oggetto ritornato da it.next()

banryu79
20-05-2010, 16:37
Il metodo remove() e la sua eventuale implementazione nell'iteratore di una mia particolare collezione che fà esattamente? Rimuove fisicamente l'oggetto dalla mia collezione che stò scorrendo con l'iteratore o cosa?

Sì, il metodo remove() di un iteratore rimuove *esattamente* l'elemento restituito dall'ultima chiamata a next(). E l'elemento rimosso appartiene alla collezione su cui si itera, non è che l'iteratore si crea una sorta di copia della collezione che usa internamente: usa prioprio la collezione stessa.

Prima di far questo però, il metodo remove() dell'iteratore verifica che la collezione sottostante non abbia subito nel frattempo "modifiche strutturali" (sono tali tutte quelle che alterano la struttura della collezione, ovvero la sua dimensione e/o l'ordine degli elementi nella collezione); se la verifica ha esito positivo (la collezione è stata modificata) parte una ConcurrentModificationException.

Per maggiori dettagli sul come sia implementata questa verifica (nota come comportamento fail-fast degli iteratori) puoi consultare il sorgente della classe AbstractList, dato che le implementazioni di Iterator e ListIterator sono definite la dentro come classi annidate private (Itr e ListItr).

Comunque, in linea di massima una lista mantiene una variabile interna usata come un contatore delle modifiche strutturali che la lista stessa subisce nel corso della sua esistenza: quando un iteratore viene creato (ne viene creato uno nuovo fiammante ad ogni invocazione del metodo iterator()) esso copia al suo interno il valore del contatore; quando poi l'utente lo utilizza per iterare la lista (ovvero durante le chiamate a next(), remove() ecc..) l'iteratore controlla se il valore corrente del contatore della lista corrisponde a quello del valore che si è salvato lui e se non è così significa che siamo in presenza di una "concurrent modification" sulla lista e l'iteratore "fallisce" sparando l'opportuna eccezione. E' un meccanismo molto semplice.

e-commerce84
20-05-2010, 16:42
Grazie mille...ora è tutto più chiaro :cool: