Iterator vs Foreach em Java
- #Java
É comum, quando estamos aprendendo sobre Collections em Java, ficarmos em dúvida sobre a diferença de se utilizar iterator ou foreach ao navegar em loops pelos nossos objetos.
O que é?
Iterator
Iterator é uma interface fornecida pela framework collection para atravessar uma collection e para uma sequência de acessos de itens dentro da coleção (collection). É chamado de "Iterator" porque "iteração" é o termo técnico para looping.
for (Iterator i = c.iterator(); i.hasNext(); )
System.out.println(i.next());
Foreach
O loop for-each serve para atravessar itens em uma collection.
for (Element e: c)
System.out.println(e);
Jeito mais moderno...
elements.forEach (e -> System.out.println(e) );
Olhando assim parece que é a mesma coisa, não é? Apenas estamos mostrando os itens das collections. Mas veja a diferença...
Diferença entre os dois
No loop for-each, não podemos modificar a collection, pois lançará uma ConcurrentModificationException. Isso ocorre porque o loop for-each cria implicitamente um iterator, mas ele não é exposto ao usuário. Daí não conseguimos modificar de fato os itens nas collections. Por outro lado, com o Iterator podemos modificar a collection. E modificar quer dizer simplesmente remover um elemento ou alterar o conteúdo de um item armazenado na coleção.
Conclusão
Quando usar cada um deles?
- Se tivermos que modificar a collection, usamos o Iterator.
- Se apenas queremos ver os itens, podemos usar o for-each. Também, ao usar loops aninhados (ou seja, loop dentro de outro loop) o melhor é utilizar o loop for-each.
Boas práticas de código para todos nós! Que a força do desenvolvimento esteja com você.
Referências: