Como el mapa de contenedores en Java:
para(Persona persona: pList){
if(persona.getGender()==Género.MALE){
pList.remove(person); //La operación de eliminación no se puede realizar durante el recorrido
}
}
Al recorrer un mapa, normalmente obtiene el conjunto de sus valores clave y luego utiliza un iterador para recorrer el mapa.
Tenga en cuenta que durante el proceso transversal, solo los elementos del Mapa se pueden procesar en consecuencia, no se pueden agregar ni reducir los elementos del Mapa. En otras palabras, el tamaño del Mapa no se puede cambiar y se producirá una excepción (no se puede utilizar durante el proceso). proceso transversal). modificar, eliminar o agregar elementos en el mapa).
La excepción informada es la excepción java.util.ConcurrentModificationException.
clase pública ConcurrentModificationException extiende RuntimeException
Esta excepción se produce cuando un método detecta modificaciones simultáneas de un objeto, pero no permite dicha modificación.
Por ejemplo, mientras un subproceso itera sobre una colección, normalmente no se permite que otro subproceso modifique linealmente la colección. A menudo, en estos casos, los resultados de la iteración no están claros. Algunas implementaciones de iteradores (incluidas todas las implementaciones de colecciones genéricas proporcionadas por JRE) pueden optar por generar esta excepción si se detecta este comportamiento. Los iteradores que realizan esta operación se denominan iteradores de falla rápida porque el iterador falla completamente rápido sin correr el riesgo de un comportamiento arbitrario no especificado en algún momento en el futuro.
Tenga en cuenta que esta excepción no siempre indicará que el objeto ha sido modificado simultáneamente por diferentes subprocesos. Un objeto puede generar esta excepción si un solo subproceso emite una secuencia de llamadas a métodos que violan el contrato del objeto. Por ejemplo, si un subproceso modifica directamente una colección mientras la itera utilizando un iterador a prueba de fallos, el iterador generará esta excepción.
Tenga en cuenta que el comportamiento a prueba de fallas de los iteradores no está garantizado porque, en general, no es posible ofrecer garantías estrictas sobre si se producirán modificaciones simultáneas no sincronizadas. Las operaciones a prueba de fallos generan una excepción ConcurrentModificationException en el mejor de los casos. Por lo tanto, es un error escribir un programa que se base en esta excepción para mejorar la corrección de dichas operaciones. El enfoque correcto es: ConcurrentModificationException solo debe usarse para detectar errores.
Al intentar modificar directamente el contenido de una Colección/Mapa mientras se utiliza un iterador rápido para iterar sobre una Colección o Mapa, se generará una excepción java.util.ConcurrentModificationException incluso cuando se ejecute bajo un solo subproceso.
Iterator trabaja en un hilo separado y tiene un bloqueo mutex. Después de crear el iterador, se establecerá una tabla de índice de enlace único que apunte al objeto original. Cuando cambie 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 retroceda, no podrá hacerlo. Se encuentra que itera el objeto, por lo que de acuerdo con el principio de falla rápida, Iterator lanzará inmediatamente una excepción java.util.ConcurrentModificationException.
Por lo tanto, el iterador no permite que el objeto iterado se cambie mientras está funcionando. Pero puede utilizar el método remove() del propio Iterator para eliminar objetos. El método Iterator.remove() eliminará el objeto de iteración actual manteniendo la coherencia del índice.
Lo interesante es que si su objeto Colección/Mapa en realidad tiene solo un elemento, no se generará la excepción ConcurrentModificationException. Es por eso que se señala en el javadoc: sería incorrecto escribir un programa que dependiera de esta excepción para su corrección: ConcurrentModificationException debe usarse solo para detectar errores.