Java für jeden vs regulären für - sind sie gleichwertig?

Sind diese beiden Konstrukte gleichwertig?

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

Verglichen mit:

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

Das ist,Wenn ich genau den gleichen Code in den Body beider Loops lege (und sie kompilieren), verhalten sie sich dann genauso?

Vollständiger Haftungsausschluss: Dies wurde von einer anderen Frage inspiriert (Java: Sind diese 2 Codes gleich). Meine Antwort dort stellte sich als nicht die Antwort heraus, aber ich glaube, dass die genaue Semantik von Java für jeden einige Nuancen aufweist, auf die hingewiesen werden muss.