java - example - ¿Por qué iterator.remove() se ha descrito como operación opcional?
iterator remove java (3)
Revisé la documentación ( http://java.sun.com/javase/6/docs/api/java/util/Iterator.html ) de Iterator.remove()
allí remove(
) se describió como
void remove()
Elimina de la colección subyacente el último elemento devuelto por el iterador (operación opcional). Este método se puede llamar solo una vez por llamada al siguiente. El comportamiento de un iterador no se especifica si la colección subyacente se modifica mientras la iteración está en progreso de ninguna otra manera que llamando a este método.
- Entonces, ¿alguien puede decir qué significa "opcional"?
- ¿Afecta esto la robustez de la operación? (Al igual que c ++, no garantiza la solidez de las operaciones).
- Por qué "opcional" se ha especificado categóricamente aquí.
- ¿Qué significa "modificación" en la segunda línea de documentación?
el comportamiento de un iterador no se especifica si la colección subyacente se modifica
# 1: Opcional significa que puede implementarlo o lanzar una UnsupportedOperationException
# 2: esta operación es opcional porque a veces simplemente no desea que se modifique el contenido de su iterador. ¿O qué entiende por "robustez de operación"?
EDIT # 4: el behavior of an iterator is unspecified if the underlying collection is modified
Normalmente, usa un iterador al ejecutar
List<String> c = new ArrayList<String>();
c.add("Item 1");
c.add("Item 2");
c.add("Item 3");
...
for (Iterator<String> i = c.iterator(); i.hasNext();)
{
String s = i.next();
...
}
Si ahora desea eliminar un elemento mientras itera a través de la lista, debe llamar
c.remove("Item 2");
esto no está limpio , posiblemente corrompe los datos en su Lista / Colección / ... y debe evitarse . En su lugar, elimine () el elemento a través del iterador :
i.remove();
En primer lugar, java.util.Iterator
es una interfaz, es decir, un acuerdo sobre cómo las clases que implementan esta interfaz interactúan con el resto del mundo. Es su responsabilidad cómo implementarán los métodos interafaciales.
Si la estructura de datos subyacente no permite la eliminación, entonces remove()
arrojará una UnsupportedOperationException
. Por ejemplo, si está iterando a través de un conjunto de resultados recuperado de un DB, tiene sentido no implementar este método.
Si itera sobre una colección que se comparte entre subprocesos concurrentes y la otra cadena modifica la cadena de iteración de datos, se obtendrán resultados no deterministas.
Se describe como opcional porque no todas las clases de colección que pueden darle un iterador implementan el método remove()
en el iterador que devuelven. Si el iterador devuelto no lo implementa, se lanzará una UnsupportedOperationException
.
Las java.util.ArrayList
, java.util.LinkedList
y otras clases de recopilación estándar implementan el método remove()
en sus iteradores, para que pueda usarlo de forma segura.