To jest starożytna metoda przechodzenia po liście:
for (int i = 0; i < stringList.size(); i++) {
System.out.println(stringList.get(i) + "\n");
}
Od Javy 5 dostępny jest taki zapis:
for (String name : stringList) {
System.out.println(name + "\n");
}
Drugi zapis wymaga by typem stringList (czyli kolekcji po której iterujemy) była albo tablica albo coś co implementuje Iterable. Iterable ma metodę, która zwraca Iterator i to właśnie Iterator jest docelowo używany, tzn ten powyższy foreach jest na etapie kompilacji zamieniany dokładnie na to, co sam zaprezentowałeś, czyli:
Iterator<String> iterator = stringList.iterator();
while (iterator.hasNext()){
String element = iterator.next();
System.out.println(element + "\n");
}
Jeśli stworzysz sobie własną klaskę, która implementuje Iterable to będziesz mógł jej użyć w Javowym foreachu. Polecam spróbować.
Uprzedzając ewentualne pytania: czemu foreach wymaga Iterable, a nie Iterator? Gdyż Iterator zmienia stan podczas iterowania i nie można go użyć dwukrotnie (nie ma metody reset ani niczego podobnego). Iterable ma metodę iterator(), która zwraca świeżego Iteratora za każdym razem, więc można iterować wielokrotnie.