итератор против цикла for и почему итератор был введен так же, как и цикл for?

Возможные дубликаты:
Каковы преимущества улучшенного цикла for и итератора в Java?
Есть ли разница в производительности между циклом for и циклом for-each?

Код ниже показывает, что как с циклом for, так и с итератором мы можем перебирать элементы коллекции, тогда в чем разница между циклом for и итератором и почему мы должны использовать только итератор в случае коллекции

    ArrayList<String> list=new ArrayList<String>();
    list.add("dipu");
    list.add("alok");
    list.add("alok");
    list.add("jyoti");
    ArrayList<Integer> al=new ArrayList<Integer>();
    al.add(1);
    al.add(2);
    String a[]={"a","b"};
    for(int i=0;i<list.size();i++)
    {
        System.out.println(list.get(i));;
    }
    for(Integer t:al)
    {
        System.out.println(t);
    }
    for (Iterator iter = list.iterator(); iter.hasNext();)
        {
        System.out.println(iter.next());
        }
    Iterator it=list.iterator();
    while(it.hasNext())
    {
    String st=it.next().toString();
    System.out.println(st);
    }

person user686303    schedule 31.03.2011    source источник
comment
Усовершенствованные циклы for работают немного быстрее, чем обычно, для обычных циклов доступа к элементам, но не для коллекций на основе массивов, поскольку они могут немедленно получить доступ к индексу с легкостью.   -  person Kurru    schedule 31.03.2011


Ответы (4)


Хотя я не знаком с Java Iterator, он очень похож на IEnumerable в .NET.

Преимущества перечислителя / итератора:

  • Вам не обязательно знать размер коллекции, для определения которой в некоторых случаях может потребоваться N шагов, что увеличивает время выполнения (хотя технически оно остается линейным). Вместо этого вы просто продолжаете переходить к следующему элементу, пока он не закончится.

  • Поскольку количество элементов коллекции не обязательно должно быть известно, итераторы могут разрешать создание коллекций динамически или «потоковую передачу» с добавлением элементов, пока вы начинаете работу с тем, что у вас уже есть. Например, вы можете унаследовать от Iterator и / или перегрузить геттеры итератора для создания классов, которые «лениво» генерируют конечные или бесконечные серии, выясняя, что представляет собой каждый элемент в вашей перечисляемой коллекции, когда вы запрашиваете его, а не когда определяете коллекцию. Вы также можете настроить буферизованный поток, в котором вы обрабатываете записи, пакеты и т. Д., Которые вы получили, в то время как другой поток или процесс работает перед вами, чтобы поставить в очередь больше, чтобы вы могли поработать.

  • Любая коллекция, которая может предоставить итератор, может быть перемещена точно так же, вместо того, чтобы знать, является ли она индексируемой, какой метод или член определяет размер и т. Д. И т. Д. Таким образом, реализации итератора предоставляют адаптер, позволяющий использовать тот же код. работать над любой переданной ему коллекцией.

  • Есть ли в Java эквивалент методов расширения .NET (статические методы, которые не являются частью определения класса, но работают с экземплярами типа и могут вызываться, как если бы они были методами экземпляра)? Если это так, вы можете определить методы, которые принимают итератор и производят результат, который может быть другим итератором. Библиотека Linq .NET в значительной степени основана на них, обеспечивая очень мощную структуру для манипулирования коллекциями, позволяющую объединять общие операции в цепочку, каждая из которых работает с результатом предыдущей операции.

person KeithS    schedule 31.03.2011

Итераторы в целом более безопасны, я бы сказал, нет риска получить доступ к индексу, которого нет. У них также есть немного больше гибкости, поскольку вы можете двигаться вперед и назад с ними, тогда как циклы for идут только в одну сторону, и на многих языках вы не можете изменить значение индекса цикла внутри цикла (т.е. вы не можете изменить скорость приращения).

Они также являются ЕДИНСТВЕННЫМ способом удаления элементов из коллекции во время итерации по ним. Удаление элемента из коллекции, когда вы проходили цикл for, было бы катастрофой и, как правило, не разрешено даже Java, я забыл, что это за исключение, но у меня есть одно для этого раньше.

Подумайте об этом, как только вы удалите предмет, все остальные сдвинутся вниз. Тем временем на вашей следующей итерации ваш индекс все еще увеличивался, что означает 2 вещи.

Во-первых, вы пропустите следующий элемент, поскольку он был перемещен в позицию, из которой вы только что удалили.

Во-вторых, ваш цикл будет выходить за пределы измененной вами коллекции.

person gnomed    schedule 31.03.2011
comment
Я не пробовал этого на Java, но знаю, что вы можете изменять массивы из цикла for на других языках. Пока вы увеличиваете / уменьшаете свою индексную переменную для элемента, который вы вставляете / удаляете, и пересчитываете длину массива на каждой итерации цикла, у вас не будет никаких проблем. - person Sam Dufel; 31.03.2011
comment
Вы можете редактировать список в обычном цикле for. НЕ в итераторе. Обычно они терпят неудачу, если вы удалите элемент из списка. - person Kurru; 31.03.2011
comment
@Sam Dufel - Я считаю, что вопрос касался коллекций, а не массивов, которые очень разные. @ Курру - Что? У итераторов есть метод remove(), который удаляет элемент, возвращенный последним вызовом next(). Я очень сомневаюсь, что итератор выйдет из строя, если вы его использовали, видя, как он предоставляется ... И, возможно, вы можете редактировать / удалять из коллекции в обычном цикле for, но зачем вам это нужно, когда вы можете сделать это более безопасно? - person gnomed; 01.04.2011

Я пытаюсь объяснить это двумя короткими предложениями:

  • С улучшенным циклом for его проще перебирать (более читабельный ..)
  • С помощью итераторов можно изменять список во время итерации, что невозможно с другими методами.
person Prine    schedule 31.03.2011

«Поток», который вы повторяете, может даже не индексироваться. То есть итератор делает возможным очень удобный шаблон «ленивого вычисления», когда данные даже не загружаются / не создаются до тех пор, пока итератор не запросит их. Это замечательно для доступа к репозиториям и базам данных, а также для работы в сети.

person n8wrl    schedule 31.03.2011