Al aprender la recopilación en Java, se observa que la colección de la interfaz de la raíz de la jerarquía de colección implementa la interfaz iterable <t> (ubicada en el paquete Java.lang), que permite que los objetos se conviertan en el objetivo de la declaración "ForEach". La única forma en esta interfaz es devolver un iterador que itera en un conjunto de elementos de tipo T.
1. Iterador
Interfaz: Iterator <t>
Public Interface Iterator <E> {boolean Hasnext (); E Next (); void eliminar (); }Mirando la API de la interfaz de Iterator, puede saber que este es un iterador que itera sobre la colección. El iterador permite que la persona que llama elimine elementos de la colección apuntada por el iterador durante la iteración utilizando semántica bien definida.
Es particularmente notable que se utiliza este método iterador eliminar (): eliminar el último elemento devuelto por el iterador de la colección apuntada por el iterador (operación opcional). Este método solo se puede llamar una vez por llamada siguiente. Si la colección apuntada por el iterador se modifica de otras maneras que no sean llamar a este método (eliminar el método) al iterar, el comportamiento del iterador es incierto. Al diseñar la interfaz iteradora <t>, el diseñador de interfaz ha señalado que al iterar, si el método remove (), excepto el iterador, se llama y la colección apuntada por el iterador se modifica, causará consecuencias inciertas. ¿Cuáles son las consecuencias dependiendo de la implementación específica del iterador? En respuesta a las posibles situaciones de esta consecuencia incierta, una de ellas se encontró cuando se aprendió ArrayList: el iterador lanza una excepción concurrente de Modificación Excepción. Las excepciones específicas se muestran en el siguiente código:
import java.util.arrayList; import java.util.collection; import java.util.iterator; public class Itaratortest {public static void main (string [] args) {colección <tring> list = new ArrayList <String> (); list.add ("Android"); list.add ("iOS"); list.add ("Windows Mobile"); Iterator <String> iterator = list.iterator (); while (iterator.hasNext ()) {string lang = iterator.next (); list.remove (lang); // lanzará concurrenteModificationException}}} Este código organizará una excepción de Modificación de Excepción concurrente cuando se ejecuta, porque no usamos el método iterador remove () para eliminar el elemento durante la ejecución del iterador, sino que usamos el método Remout () de ArrayList para cambiar la colección apuntada por el iterador. Esto viola los principios de diseño del iterador, por lo que ocurre una excepción.
La anormalidad informada es la siguiente:
Excepción en hilo "principal" java.util.concurrentModificationException
en java.util.arraylist $ ittr.checkforComodification (arrayList.java:859)
en java.util.arraylist $ ittr.next (arraylist.java:831)
en text.itaratortest.main (taratortest.java:17)
2. For-ENTRA ITERADOR DE COMBRA E ITERADOR <T>
A partir de Java 5, hay un bucle for-Eather en Java, que se puede usar para recorrer la colección y la matriz. Los bucles foreach le permiten atravesar la colección sin llamar al método Hasnext () en el bucle While sin mantener el índice en el bucle tradicional para el bucle, o usar iterator /listIterator (una implementación de iterador en ArrayList). El bucle for-Earl simplifica el proceso transversal de cualquier colección o matriz. Sin embargo, hay dos puntos a los que prestar atención al usar bucles de Foreach.
Los objetos que usan bucles foreach deben implementar la interfaz iterable <t>
Consulte el siguiente ejemplo:
import java.util.arrayList; clase pública foreachTest1 {public static void main (string args []) {customCollection <String> myCollection = new CustomCollection <String> (); MyCollection.Add ("Java"); MyCollection.Add ("Scala"); MyCollection.Add ("Groovy"); // ¿Qué hará este código, imprima el idioma, la excepción de la excepción o // compilar el error de tiempo para (String Language: MyCollection) {System.out.println (idioma); }} Clase privada CustomCollection <T> {private ArrayList <T> bucket; public CustomCollection () {bucket = new ArrayList (); } public int size () {return bucket.size (); } public boolean isEtimty () {return bucket.isEmpty (); } public boolean contiene (t o) {return bucket.contains (o); } public boolean add (t e) {return bucket.add (e); } Public Boolean Eliminar (T o) {return bucket.remove (o); }}} El código anterior no se compilará, porque la clase CustomCollection en el código no implementa la interfaz iterable <t>, y el error informado durante el período de compilación es el siguiente:
Excepción en el hilo "principal" java.lang.error: Problema de compilación no resuelto:
Solo puede iterar sobre una matriz o una instancia de java.lang.iterable
en Text.ForEachTest1.Main (foreachTest1.Java:15)
De hecho, no hay necesidad de esperar hasta la compilación para encontrar un error. Eclipse mostrará un error en el bucle foreach después de que se termine el código: solo puede iterar sobre una matriz o una instancia de java.lang.iterable
Se puede confirmar nuevamente en el ejemplo anterior que el bucle foreach solo es aplicable a los objetos que implementan la interfaz iterable <t>. Dado que todas las clases de colección incorporadas implementan la interfaz java.util.collection y han heredado ITerable, para resolver el problema anterior, puede elegir simplemente habilitar CustomCollection para implementar la interfaz de recopilación o heredar la recolección abstracta. La solución es la siguiente:
import java.util.abstractCollection; import java.util.arrayList; import java.util.iterator; public class foreachTest {public static void main (string args []) {customCollection <String> myCollection = new CustomCollection <String> (); MyCollection.Add ("Java"); MyCollection.Add ("Scala"); MyCollection.Add ("Groovy"); for (lenguaje de cadena: myCollection) {system.out.println (idioma); }} Clase estática privada CustomCollection <T> extiende AbstractCollection <T> {private ArrayList <T> bucket; public CustomCollection () {bucket = new ArrayList (); } public int size () {return bucket.size (); } public boolean isEtimty () {return bucket.isEmpty (); } public boolean contiene (objeto o) {return bucket.contains (o); } public boolean add (t e) {return bucket.add (e); } public boolean Retember (objeto o) {return bucket.remove (o); } @Override public Iterator <T> iterator () {// TODO Método Generado automático de retorno Bucket.iterator (); }}}2. La implementación interna del bucle foreach también es implementada por Iterator.
Para verificar el hecho de que el bucle foreach usa iterador como implementación interna, todavía usamos el ejemplo inicial de este artículo para verificar:
Clase pública ITARATORTEST {public static void main (String [] args) {colección <tring> list = new ArrayList <String> (); list.add ("Android"); list.add ("iOS"); list.add ("Windows Mobile"); // Ejemplo1 // iterator <String> iterator = list.iterator (); // while (iterator.hasnext ()) {// string lang = iterator.next (); // list.remove (lang); //} // Ejemplo 2 para (lenguaje de cadena: list) {list.remove (idioma); }}} Excepción informada cuando se ejecuta el programa:
Excepción en hilo "principal" java.util.concurrentModificationException
en java.util.arraylist $ ittr.checkforComodification (arrayList.java:859)
en java.util.arraylist $ ittr.next (arraylist.java:831)
en text.itaratortest.main (taratortest.java:22)
Esta excepción solo muestra que el bucle for-Ealls usa Iterator para iterar a través de la colección, que también llama a Iterator.next (), que verifica (elemento) cambia y arroja una concurrencia concurrente.
Resumir:
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.