bucles for-each y for

Varias veces me he encontrado con casos en los que el bucle for-each causaba problemas, incluidas excepciones y bloqueos, mientras que el for(it=list.iterator;it.hasNext();) funcionaria sin problemas. Esto incluye la modificación de la colección (que sé que no debería ocurrir en for-each, pero no sé por qué), así como otros casos en los que clono cosas. No recuerdo ningún ejemplo específico de cajero automático. Acabo de pensar en ello.

¿No es for-each solo un atajo para el segundo tipo de bucle que señalé? ¿Alguien podría explicar exactamente cuál es la diferencia allí?

preguntado el 03 de mayo de 12 a las 15:05

2 Respuestas

El problema es cuando en foreach bucle usted remove un elemento. Al usar un iterador, tiene un remove método. Cuando usas foreach no tiene acceso directo al iterador subyacente y no puede llamar a su remove método.

Por lo demás es lo mismo. Foreach no causa más problemas o caídas. Simplemente no puede eliminar un elemento.

contestado el 03 de mayo de 12 a las 15:05

for-each es solo un azúcar sintáctico introducido en Java 1.5. Utiliza iterador obtenido de Iterable detrás de la escena.

La única diferencia razonable que mencionó es la modificación de la colección durante la iteración. Sí, es imposible. Las colecciones no se pueden modificar durante la iteración usando Iterator. El intento provoca ConcurrentModificationException. Esto es relevante para ambos casos (uso explícito e implícito del iterador).

La única excepción es usar Iterator.remove() (cuando es compatible). En este caso, el iterador no arroja la excepción.

La razón es clara. El iterador no puede iterar la colección que se cambia durante la iteración a menos que conozca el cambio y pueda reorganizarse. Esto es lo que sucede cuando estás usando Iterator.remove().

contestado el 03 de mayo de 12 a las 15:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.