Fala galera!
Este tópico é sobre remover elementos em uma estrutura do framework Collection e sobre a classe Iterator.
Estou estudando sobre Collections e brincando um pouco com o código cheguei ao seguinte problema:
No código abaixo, tenho 3 loops (1, 2 e 3 comentado).
O dois primeiros loops são loops do tipo enhanced-for. O loop 1 se comporta como eu esperava porém o loop 2, não.
Eu espera remover todas as cores que começam com a letra “B”, mas é lançado uma exception.
Só consegui fazer a remoção usando um Iterator, conforme loop 3.
Quero entender por que o Java se comporta de forma diferente do loop 1 no loop2 se a lógica e estrutura do código são muito similares.
Código:
public class TestCollections {
public static void main(String[] args) {
Set<String> colors = new HashSet<>();
colors.add("Blue");
colors.add("Red");
colors.add("Purple");
colors.add("Yellow");
colors.add("Black");
System.out.println(colors);
colors.remove("Red");
System.out.println(colors);
colors.add("Brown");
//1
for (String color : colors) {
if (color.startsWith("B")) {
System.out.println(color);
}
}
//2
for (String color : colors) {
if (color.startsWith("B")) {
colors.remove(color);
}
}
//3
Iterator<String> iterator = colors.iterator();
while (iterator.hasNext()) {
if (iterator.next().startsWith("B")) iterator.remove();
}
System.out.println(colors);
}
}
Exception:
Exception in thread "main" java.util.ConcurrentModificationException
at java.base/java.util.HashMap$HashIterator.nextNode(HashMap.java:1511)
at java.base/java.util.HashMap$KeyIterator.next(HashMap.java:1534)
at diocollection.sets.exe.TestCollections.main(TestCollections.java:30)