Чтобы ответить на дополнительный вопрос:
Усовершенствованный цикл for имеет два варианта. Один из них, когда аргумент collection
в
for(E o : collection) {
...
}
- это то, что реализует Iterable<E>
, в точности эквивалентно
for (Iterator<E> iter = collection.iterator(); iter.hasNext(); ) {
E o = iter.next();
...
}
(с той разницей, что у Итератора нет имени переменной, к которому вы можете обращаться в оставшейся части цикла). Компилятор будет генерировать совершенно одинаковый или даже точно такой же код для каждой версии.
Существует еще один вариант расширенного цикла for
: когда collection
является массивом, он будет скомпилирован в нечто вроде этого:
E[] a = collection;
for(int i = 0; i < a.length; i++) {
E o = a[i];
...
}
(Конечно, здесь мы не можем напрямую получить доступ к a
или i
.)
Кстати, компилятор не не импортирует java.util.Iterator
- в скомпилированном байт-коде каждый тип упоминается своим полным именем. (Во всяком случае, локальные переменные на самом деле не типизированы - другие для некоторых checkcast
утверждений.)