Se você está apenas vagando pela coleção para ler todos os valores, não há diferença entre usar um iterador ou a nova sintaxe de loop for, pois a nova sintaxe apenas usa o iterador debaixo d'água.
Se, no entanto, você quer dizer com loop o antigo loop "estilo c":
for(int i=0; i<list.size(); i++) {
Object o = list.get(i);
}
Então o novo loop for, ou iterador, pode ser muito mais eficiente, dependendo da estrutura de dados subjacente. A razão para isso é que, para algumas estruturas de dados, get(i)
é uma operação O (n), que torna o loop uma operação O (n 2 ). Uma lista vinculada tradicional é um exemplo dessa estrutura de dados. Todos os iteradores têm como requisito fundamental que next()
deve ser uma operação O (1), fazendo o loop O (n).
Para verificar se o iterador é usado debaixo d'água pela nova sintaxe de loop for, compare os bytecodes gerados a partir dos dois snippets Java a seguir. Primeiro o loop for:
List<Integer> a = new ArrayList<Integer>();
for (Integer integer : a)
{
integer.toString();
}
// Byte code
ALOAD 1
INVOKEINTERFACE java/util/List.iterator()Ljava/util/Iterator;
ASTORE 3
GOTO L2
L3
ALOAD 3
INVOKEINTERFACE java/util/Iterator.next()Ljava/lang/Object;
CHECKCAST java/lang/Integer
ASTORE 2
ALOAD 2
INVOKEVIRTUAL java/lang/Integer.toString()Ljava/lang/String;
POP
L2
ALOAD 3
INVOKEINTERFACE java/util/Iterator.hasNext()Z
IFNE L3
E segundo, o iterador:
List<Integer> a = new ArrayList<Integer>();
for (Iterator iterator = a.iterator(); iterator.hasNext();)
{
Integer integer = (Integer) iterator.next();
integer.toString();
}
// Bytecode:
ALOAD 1
INVOKEINTERFACE java/util/List.iterator()Ljava/util/Iterator;
ASTORE 2
GOTO L7
L8
ALOAD 2
INVOKEINTERFACE java/util/Iterator.next()Ljava/lang/Object;
CHECKCAST java/lang/Integer
ASTORE 3
ALOAD 3
INVOKEVIRTUAL java/lang/Integer.toString()Ljava/lang/String;
POP
L7
ALOAD 2
INVOKEINTERFACE java/util/Iterator.hasNext()Z
IFNE L8
Como você pode ver, o código de bytes gerado é efetivamente idêntico; portanto, não há penalidade de desempenho ao usar qualquer um dos formulários. Portanto, você deve escolher a forma de loop mais esteticamente atraente para você, para a maioria das pessoas que será o loop for-each, pois possui menos código padrão.