Java para cada vs regular para - eles são equivalentes?

Essas duas construções são equivalentes?

char[] arr = new char[5];
for (char x : arr) {
    // code goes here
}

Comparado com:

char[] arr = new char[5];
for (int i = 0; i < arr.length; i++) {
    char x = arr[i];
    // code goes here
}

Isso é,se eu colocar exatamente o mesmo código no corpo dos dois loops (e eles compilarem), eles se comportarão exatamente da mesma maneira ???

Isenção total: isso foi inspirado em outra pergunta (Java: esses 2 códigos são iguais) Minha resposta acabou não sendo a resposta, mas sinto que a semântica exata do Java para cada um tem algumas nuances que precisam ser destacadas.