Prefacio
La razón para introducir mejoradas para bucles: en versiones anteriores de JDK5, es más problemático atravesar elementos en una matriz o colección e iterador de la longitud o colección de la matriz.
Una nueva sintaxis se define en JDK5, se mejora para los bucles para simplificar tales operaciones. Mejorado para bucles solo se pueden usar en matrices o colecciones que implementan interfaces iterables.
Formato de sintaxis:
para (Variable de tipo variable: matriz o colección que debe ser iterada) {
}
En Java, el recorrido de colecciones y matrices generalmente tiene los siguientes tres formularios:
for (int i = 0; i <list.size (); i ++) {system.out.print (list.get (i)+",");} iterator iterator = list.iterator (); while (iterator.hasnext ()) {System.out.print (iterator.next () + ",");} for (Integer I: list) {System.out.print (i + ",");} El primero es ordinario para el recorrido de bucle, el segundo es usar iteradores para el recorrido, y el tercero generalmente se llama mejor para bucle (para cada uno).
Principio de implementación
Se puede ver que la tercera forma es el azúcar sintáctica proporcionada por Java. Aquí analizamos cómo se implementa esto mejorado para bucle en la capa subyacente.
Descompilamos el siguiente código:
para (Integer I: List) {System.out.println (i);}Después de la descompilación:
Entero i; for (iterator iterator = list.iterator (); iterator.hasnext (); system.out.println (i)) {i = (integer) iterator.next (); } El código descompilado es realmente bastante complicado, así que descoméalo en el orden de ejecución:
Entero i; Define una variable temporal i
Iterador iterator = list.iterator (); Obtenga el iterador de la lista
iterator.hasNext (); determina si hay elementos no controlados en el iterador
i = (entero) iterator.next (); Obtenga el primer elemento no controlado y asignarlo a la variable temporal I
System.out.println (i) genera el valor de la variable temporal I
Esto se aplica hasta que todos los elementos de la lista estén atravesados.
A través de la descompilación, vemos que la capa subyacente de mejorada para los bucles en Java en realidad se implementa a través del patrón de iterador.
El pozo de mejorar el bucle para
Se dice que este es un pozo en la mejora del bucle, pero en realidad se debe principalmente a que algunas personas pueden entrar en el pozo en el principio de implementación de la mejora para el bucle.
Dado que la mejora para el bucle se implementa a través de un iterador, debe tener las características de un iterador.
Hay un mecanismo fallido en Java. Cuando use un iterador para atravesar elementos, debe tener cuidado al eliminar la colección. Si lo usa de manera incorrecta, puede ocurrir concurrenteModificationException. Esta es una excepción de tiempo de ejecución y no ocurrirá durante el período de compilación. Solo explotará cuando el programa realmente se esté ejecutando.
Como en el siguiente código:
para (Student Stu: Students) {if (stu.getid () == 2) Students.remove (stu); }Se lanzará una excepción concurrente de modificación.
Iterator funciona en un hilo separado y tiene un bloqueo mutex. Después de crear el iterador, se creará una tabla de índice de enlace único que apunta al objeto original. Cuando cambia el número de objetos originales, el contenido de esta tabla de índice no cambiará sincrónicamente, por lo que cuando el puntero de índice se mueva hacia atrás, el objeto a iterar no se puede encontrar, por lo que de acuerdo con el principio de falla, iterador se lanzará de inmediato.
java.util.concurrentModificationException Exception.
Por lo tanto, el iterador no permite que los objetos iterados se cambien cuando funciona.
Pero puede usar el método de iterador remove() para eliminar el objeto. Iterator.remove() mantendrá la consistencia del índice al eliminar el objeto iterado actual.
Eliminar correctamente los elementos mientras atraviesa:
Iterador <deudante> stuiter = students.iterator (); while (stuiter.hasNext ()) {Student Student = stuiter.next (); if (student.getid () == 2) stuiter.remove (); // Aquí debe usar el método eliminar el iterador para eliminar el objeto actual. Si utiliza el método de eliminación de la lista, concurrentModificationException también aparecerá} Ok, aquí le presentaré el principio de implementación de mejorar el bucle for y las trampas en las que puede caer si lo usa incorrectamente. Por lo tanto, aunque es una simple sintaxis para cada uno, también debe comprender sus principios, de lo contrario puede conducir a algunos problemas inexplicables.
Resumir
Lo anterior es todo el contenido de este artículo. Espero que el contenido de este artículo tenga cierto valor de referencia para el estudio o el trabajo de todos. Si tiene alguna pregunta, puede dejar un mensaje para comunicarse. Gracias por su apoyo a Wulin.com.