Nos últimos dias tenho trabalhado bastante com coleções (collections) do java. Estava habituado a usar Iterator para varrer as coleções. Na versão do Java 5, houve a implementação do foreach para java que mudou a forma como iteramos sobre uma coleção.

Normalmente fazíamos da forma:

List<object> objects = new ArrayList<object>();
objects.add(obj1);
...
objects.add(objn);

Iterator<object> it = objects.iterator();
while (it.hasNext()) {
  Object o = it.next();
  // do something with the object 'o'
}

Quando precisamos realmente trabalhar com o objeto, precisamos de uma referência aquele objeto, caso contrário:

while (it.hastNext()) {
  it.next().method1();
  it.next().method2(); // could result exception
}

Neste caso it.next() lê o objeto corrente e incrementa um marcador para o elemento seguinte. Se usarmos o it.next() novamenete, estaremos trabalhando com outra referência, o que poderia ser um vazio ou um ponteiro nulo.

Por estes motivos a forma de iterar sobre coleções foi mudado para o foreach, que possui a seguinte implementação:

for (Object o : objects) {
  // do something with the object 'o'
}

Na prática, quando compilamos o código o resultado do o foreach é o mesmo para a iteração do primeiro caso apresentado, onde criamos um marcador para referênciar o objeto da coleção lido. Usando o for-each trabalhamos de forma mais segura quando iteramos, resultando também num código mais legível, mantendo a tipagem sobre generics collections.

Se tiver dúvidas basta criar um código e compilá-lo.

Depois use o comando javap -c CompiledClass note que não há extensão .class

Relembrando, o uso de foreach só é válido na versão do Java 5+

update

Uma observação que gostária de fazer é a seguinte, alguns programadores gostam de usar a seguinte codifição para iteração:

for (Iterator<object> it = objects.iterator(); it.hasNext(); ) {
   Object o = it.next();
   // do something
}

É uma opção de cada um, mas acredito que o uso do while fornece um legibilidade de código muito maior, o for ele tende a amontar muita informaçao numa unica linha o que prejudica a leitura. O resultado de compilação é o mesmo tanto para for como while, uma vez que o for é uma expansão para while, ou seja, durante o processo de compilação o bloco de código do for será convertido para o formato do while.