Список против списка итератор - PullRequest
5 голосов
/ 07 декабря 2011

У меня есть один список:

List<Object> myList = new ArrayList<Object>();

Чтобы получить из этого списка есть два метода:

1.

for(Object obj : myList )
{
    // some code
}

2.

Iterator<Object> objIt = myList.iterator();
while(obj.hasNext()) {
    Object obj = (Object)objIt.next();
    // some code
}

У меня вопрос, какой из них эффективен для памяти и быстро повторяется?

Ответы [ 6 ]

12 голосов
/ 07 декабря 2011

Они делают то же самое - расширенный цикл for является просто синтаксическим сахаром для обычной версии (для итераций; для массивов это немного отличается). Если вам не нужен итератор явно (например, для вызова remove()), я бы использовал первую версию.

См. раздел 14.14.2 спецификации языка Java для более подробной информации о точном преобразовании, выполняемом компилятором.

4 голосов
/ 07 декабря 2011

Использование Iterator обеспечивает гораздо более безопасный доступ к List извне определяющего class, поскольку вы не можете случайно переопределить, например, весь List. Вы можете получить доступ только к одному элементу за раз: к верхнему.

Таким образом, наша рекомендация - использовать только подход for each внутри определяющего класса, и всякий раз, когда необходимо получить доступ к списку извне, следует использовать итератор. Это также усиливает концепцию сохранения логики изменения члена внутри class, который его содержит. Все сложные операции, которые необходимы снаружи, должны быть реализованы в public методах внутри этого class.

2 голосов
/ 07 декабря 2011

Итератор: выдает результат при необходимости и не получает весь результат в памяти

2 голосов
/ 07 декабря 2011

Первый - это то, что вы называете «усовершенствованным циклом», который был представлен в JDK 1.5 +

Это более удобный способ перебора списка. Кроме того, вам не нужно делать явные приведения, если вы используете это.

С точки зрения производительности, я не думаю, что между ними нет большой разницы.

1 голос
/ 07 декабря 2011

Первый вариант более понятен, но если вы хотите удалить элементы при посещении списка, ваш единственный выбор - итератор.

1 голос
/ 07 декабря 2011

Улучшен цикл, используемый итератором только внутри него. Так что оба одинаковы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...