Zastanów się:
List<String> someList = new ArrayList<String>();
// add "monkey", "donkey", "skeleton key" to someList
for (String item : someList) {
System.out.println(item);
}
Jak wyglądałaby równoważna pętla for
bez użycia składni for each?
for (Iterator<String> i = someIterable.iterator(); i.hasNext();) {
String item = i.next();
System.out.println(item);
}
Zauważ, że jeśli musisz użyć i.remove();
w swojej pętli, lub uzyskać dostęp do rzeczywistego iteratora w jakiś sposób, nie możesz użyć idiomu for ( : )
, ponieważ rzeczywisty iterator jest jedynie wnioskowany.
Jak zauważył Denis Bueno, ten kod działa dla każdego obiektu, który implementuje interfejs Iterable
.
Również, jeśli prawa strona idiomu for (:)
jest array
a nie obiektem Iterable
, wewnętrzny kod używa licznika indeksu int i sprawdza względem array.length
zamiast tego. Zobacz Specyfikacja języka Java.
Pętla for-each w Javie wykorzystuje bazowy mechanizm iteratorów. Jest więc identyczna jak poniższa:
Iterator<String> iterator = someList.iterator();
while (iterator.hasNext()) {
String item = iterator.next();
System.out.println(item);
}