Каковы преимущества использования итератора в Java

Я просматривал следующий пример кода:

public class GenericTest {

 public static void main (String[] args) {

  ArrayList<String> myList = new ArrayList<String>();
  String s1 = "one";
  String s2 = "two";
  String s3 = "three";

  myList.add(s1); myList.add(s2); myList.add(s3);
  String st;

  Iterator<String> itr = myList.iterator();

  while (itr.hasNext()) {
   st = itr.next();
   System.out.println(st);
  }
 }
}

Мне интересно, какие преимущества можно использовать для реализации интерфейса Iterator вместо использования простого статического для каждого цикла?

 for ( String str : myList ) {
  System.out.println(str);
 }

Если этот пример не имеет значения, что было бы хорошей ситуацией, когда мы должны использовать Итератор?

Спасибо.

Ответ 1

Для каждой петли был введен с Java 5, поэтому он не так "старый".

Если вы хотите только итерировать коллекцию, вы должны использовать для каждого цикла

for (String str : myList) {
   System.out.println(str);
}

Но иногда метод hasNext() "простого старого" Iterator очень полезен, чтобы проверить, есть ли больше элементов для итератора.

for (Iterator<String> it = myList.iterator(); it.hasNext(); ) {
   String str = it.next();
   System.out.print(str);
   if (it.hasNext()) {
      System.out.print(";");     
   }
}

Вы также можете вызвать it.remove(), чтобы удалить последний элемент, который был возвращен следующим.

И есть ListIterator<E>, который обеспечивает двухсторонний обход it.next() и it.previous().

Таким образом, они не эквивалентны. Оба необходимы.

Ответ 2

В принципе, цикл foreach является ярлыком для наиболее часто используемого итератора. Это итерация по всем элементам. Но есть некоторые отличия:

  • Вы можете выполнять итерацию по массиву с использованием цикла foreach непосредственно
  • Вы можете удалить объекты с помощью итератора, но вы не можете сделать это с помощью цикла foreach
  • Иногда полезно передать итератору функцию (специально рекурсивную)

Ответ 3

for ( String str : myList ) { System.out.println(str); }

этот код фактически будет использовать myList.Iterator для итератора над списком.

новый цикл for, добавленный с java 5, чтобы упростить итерацию по коллекциям и массивам.

by Iterator каждая реализация в Java Collection может иметь свой собственный путь итерации (List, Set, LinkedList, Map или....)

вы можете реализовать этот интерфейс и в своих пользовательских классах. позволить другому итератору кода над элементами, которые у вас есть внутри вашего объекта.

Ответ 4

Я не думаю, что есть какое-либо преимущество в производительности при использовании либо в большинстве случаев, если вы просто выполняете итерацию по коллекции/массиву. Но использование может отличаться в зависимости от вашего варианта использования.

  • Если ваш случай только итерации над списком, использование для каждого цикл следует использовать, поскольку Java 1.5.
  • Но если ваш случай манипулирует в то время как итерация для использования интерфейса Итератора.

Ответ 5

Итератор - это абстракция того, как реализуется коллекция. Он позволяет вам просматривать всю коллекцию по одному элементу за раз, при необходимости удаляя элементы.

Недостатком Iterator является то, что он может быть очень медленным, если вы знаете базовую реализацию. Например, использование Iterator для ArrayList значительно медленнее, чем просто вызов ArrayList.get(i) для каждого элемента. Неважно, зависит ли это от того, что делает код.

Ответ 6

Эти два эквивалента в работе и производительности почти во всех случаях. Единственное различие заключается в том, что Iterators поддерживаются в старых версиях Java JVM, а новый синтаксис "для" был введен только в JSDK 1.5 ( "Java 5" ), а некоторые люди хотят оставаться совместимыми с 1.4 или более ранними версиями.