[java] iterator와 iterable의 차이점과 사용 방법은 무엇입니까?

나는 Java에서 처음이며 반복자와 혼동되어 반복 가능합니다. 누구든지 나에게 설명하고 몇 가지 예를 들어 줄 수 있습니까?



답변

Iterable통해 반복 될 수있는 일련의 요소의 간단한 표현이다. “현재 요소”와 같은 반복 상태가 없습니다. 대신에을 생성하는 한 가지 방법이 Iterator있습니다.

An Iterator은 반복 상태의 객체입니다. 사용하여 더 많은 요소가 있는지 확인하고을 사용 hasNext()하여 다음 요소 (있는 경우)로 이동하십시오 next().

일반적으로 Iterable유효한 수를 얼마든지 생성 할 수 있어야합니다 Iterator.


답변

구현은 자체 Iterable를 제공 하는 구현입니다 Iterator.

public interface Iterable<T>
{
    Iterator<T> iterator();
}

반복자는 할당 권한없이 (데이터를 제거 할 수는 있지만) 일부는 데이터 콜렉션을 반복 할 수있는 간단한 방법입니다.

public interface Iterator<E>
{
    boolean hasNext();
    E next();
    void remove();
}

Javadoc을 참조하십시오 .


답변

이해를 돕기 위해 ArrayList에 대한 질문에 대한 예를 들어 설명하겠습니다.

  1. 반복 가능한 인터페이스는 서브 클래스가 추상 메소드 ‘iterator ()’를 구현하도록합니다.
public interface Iterable {
  ...
  abstract Iterator<T> iterator(); //Returns an 'Iterator'(not iterator) over elements of type T.
  ...
}
  1. 반복자 인터페이스는 서브 클래스가 추상 메소드 ‘hasNext ()’및 ‘next ()’를 구현하도록합니다.
public interface Iterator {
  ...
  abstract boolean hasNext(); //Returns true if the iteration has more elements.
  abstract E next();          //Returns the next element in the iteration.
  ...
}
  1. ArrayList는 List를 구현하고 List는 Collection을 확장하고 Collection은 Iterable을 확장합니다. 즉, 다음과 같은 관계를 볼 수 있습니다.

    ‘반복 가능 <-Collection <-List <-ArrayList’

. Iterable, Collection 및 List는 추상 메소드 ‘iterator ()’를 선언하고 ArrayList만으로 구현합니다.

  1. 자세한 내용은 다음과 같이 ‘iterator ()’메서드를 사용하여 ArrayList 소스 코드를 표시합니다.

‘iterator ()’메소드는 ‘Iterator’를 구현하는 ‘Itr’클래스의 오브젝트를 리턴합니다.

public class ArrayList<E> ... implements List<E>, ...
{
  ...
  public Iterator<E> iterator() {
              return new Itr();
  }


  private class Itr implements Iterator<E> {
          ...

          public boolean hasNext() {
              return cursor != size;
          }
          @SuppressWarnings("unchecked")
          public E next() {
              checkForComodification();
              int i = cursor;
              if (i >= size)
                  throw new NoSuchElementException();
              Object[] elementData = ArrayList.this.elementData;
              if (i >= elementData.length)
                  throw new ConcurrentModificationException();
              cursor = i + 1;
              return (E) elementData[lastRet = i];
          }
          ...
  }
}
  1. 다른 메소드 또는 클래스는 Iterator (Itr)를 사용하여 ArrayList와 같은 컬렉션 요소를 반복합니다.

다음은 간단한 예입니다.

public static void main(String[] args) {

    List<String> list = new ArrayList<>();
    list.add("a");
    list.add("b");
    list.add("c");
    list.add("d");
    list.add("e");
    list.add("f");

    Iterator<String> iterator = list.iterator();
    while (iterator.hasNext()) {
        String string = iterator.next();
        System.out.println(string);
    }
}

자, 분명해? 🙂


답변

콜렉션이 반복 가능한 경우, 반복자를 사용하여 반복 할 수 있습니다 (따라서 각 루프에 사용할 수 있습니다). 반복자는 콜렉션을 반복하는 실제 오브젝트입니다.


답변

Iterable 인터페이스를 구현하면 객체가 “foreach”문의 대상이 될 수 있습니다.

class SomeClass implements Iterable<String> {}

class Main
{
  public void method()
  {
     SomeClass someClass = new SomeClass();
     .....

    for(String s : someClass) {
     //do something
    }
  }
}

반복자는 인터페이스를 반복하는 요소를 구현하는 인터페이스입니다. Iterable은 Iterator를 제공하는 인터페이스입니다.


답변

가장 중요한 고려 사항은 해당 항목을 두 번 이상 통과 할 수 있는지 여부입니다. iterator ()를 다시 호출하여 항상 Iterable을 되 감을 수 있기 때문에 반복자를 되 감는 방법이 없기 때문입니다.


답변

여기 에 설명 된대로 루프 에서 사용할 수 있도록 “ 반복 가능 ”이 도입되었습니다 foreach. Iterable 인터페이스를 구현하는 클래스는 반복 될 수 있습니다.

Iterator는 Iterable 에 대한 반복을 관리하는 클래스입니다 . 현재 반복 위치의 상태를 유지하고 다음 요소가 무엇이며 어떻게 얻을 수 있는지 알고 있습니다.