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


197

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

답변:


201

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

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

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


그 문제는 않을 경우 Iterableinteral또는 external반복자하거나이 가능 그들 중 어떤이가?
sakhunzai

91

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

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

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

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

Javadoc을 참조하십시오 .


17

이해를 돕기 위해 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);
    }
}

자, 분명해? :)


좋은 대답입니다.!
Kavindu Dodanduwa

이 게시물을 이해했지만 Iterable<T>이 시나리오에서 반환 유형이 인 메소드를 작성하려면 어떤 단계를 구현해야합니까? 그 예도 제안하십시오.
Prasanna Sasne

12

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


2
참고로 java.util.Collection은 항상 java.util.Iterable을 구현합니다.
Paul Draper

2
그렇지 java.lang.Iterable않습니까?
ulab

그것은java.lang.Iterable
aldok

9

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

class SomeClass implements Iterable<String> {}

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

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

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


1
Iterable을 구현하는 클래스가 있으면 Iterator () 메서드가 있어야합니다. ?? 내가 틀렸다면 나를 바로 잡으십시오.
Chinmaya B

예. 인터페이스의 구현되지 않은 메소드가 있어야합니다. 이 경우에는 Iterator입니다.
agent.smith

지능적인 답변에 감사드립니다. Iterable vs Iterator에 대한 이해를 다시 확인하기 위해 여기에 왔습니다. 확인했습니다. 다른 모든 답변은 구조에 대해 이야기하지만, 나는 괜찮다고 생각하지만 왜 다른 것을 사용하는지에 대한 질문에 대답하지 않습니다.
EricGreg

나에게 이것은 최선의 대답입니다.
Sam

String의 각 루프에 대해 이점이 무엇인지 알고 싶었습니다. someClass. someClass는 java 클래스 객체이고 String 참조입니다. 어떤 상황에서 그러한 구현과 함께 가야합니다.
Neeraj

8

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


왜 Iterable을 구현하고 Iterator 객체를 반환하는 대신 컬렉션 클래스가 Iterator 인터페이스를 직접 구현하지 않는지 궁금합니다. 이 답변을 통해 명확하게 알 수있었습니다.이 경우 컬렉션을 여러 번 트래버스 할 수없고 동시에 여러 스레드를 통해 트래킹 할 수 없었습니다. 이것은 매우 중요한 답변입니다.
simpleDev

2

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

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


2

사과가 10 개인 예를 생각해보십시오. Iterable을 구현할 때 각 사과를 1에서 10 사이의 상자에 넣고 탐색하는 데 사용할 수있는 반복자를 반환하는 것과 같습니다.

반복자를 구현하면 다음 상자에 모든 사과, 사과를 얻을 수 있습니다.

따라서 iterable을 구현하면 반복자가 요소를 탐색 할 수 있지만 반복자는 반복자를 구현해야합니다.


1

질문 : Iterable과 Iterator의 차이점은 무엇입니까?
답변 :

iterable : forEach 루프
iterator와 관련이 있습니다 : Collection과 관련이 있습니다

forEach 루프의 대상 요소는 반복 가능해야합니다.
Iterator를 사용하여 Collection에서 객체를 하나씩 가져올 수 있습니다.

java.ḷang 패키지에있는 반복 가능
java.util 패키지에 있는 반복 가능

iterator () 메소드를 하나만 포함합니다
hasNext (), next (), remove () 메소드를 포함합니다

1.5 버전으로
소개 1.2 버전으로 소개


1

기본적으로, 둘 다 서로 밀접하게 관련되어 있습니다.

IteratorhasNext (), next () 및 remove ()와 같은 정의되지 않은 메소드를 사용하여 콜렉션을 순회하는 데 도움이되는 인터페이스라고 생각하십시오.

반대로 Iterable 은 클래스에 의해 구현되는 경우 클래스를 Iterable로 만들고 For-Each 구성의 대상인 인터페이스입니다. iterator ()라는 이름의 iterator ()라는 메소드 만 있습니다.

콜렉션이 반복 가능한 경우 반복자를 사용하여 반복 할 수 있습니다.

이해를 위해 다음을 방문하십시오.

ITERABLE : http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/Iterable.java

ITERATOR http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/Iterator.java


1

나는 이것이 오래된 질문이라는 것을 알고 있지만, 같은 질문에 갇혀 있고 모든 용어에 압도적 인 사람을 위해이 반복문과 반복자 사이 의이 구별을 이해하는 데 도움이되는 훌륭하고 간단한 비유가 있습니다.

공공 도서관을 생각하십시오. 오래된 학교. 종이 책과 함께. 예, 그런 종류의 도서관.

책으로 가득 찬 선반은 반복 가능한 것과 같습니다. 선반에서 긴 줄의 책을 볼 수 있습니다. 당신은 얼마나 많은 것을 알지 못하지만, 그것이 긴 책 모음임을 알 수 있습니다.

사서는 반복자와 같습니다. 그는 언제든지 특정 책을 가리킬 수 있습니다. 그는 자신이 가리키는 위치에서 책을 삽입 / 제거 / 수정 / 읽을 수 있습니다. 그는 "다음!"을 외칠 때마다 순서대로 각 책을 가리 킵니다. 그에게. 그래서, 당신은 일반적으로 그에게 다음과 같이 물어볼 것입니다 : "다음이 있습니까?" 그는 다음 책을 가리킬 것입니다. 그는 또한 선반 끝에 도달했을 때를 알고 있으므로 다음과 같이 물을 때 "다음이 있습니까?" 그는 "아니오"라고 말할 것입니다.

조금 어리 석다는 것을 알고 있지만 이것이 도움이되기를 바랍니다.


0

ColinDSeeker 답변 외에도 .

간단히 말해서 IterableIterator 는 Java Collection Collection에서 제공되는 인터페이스입니다.

반복 가능

컬렉션 마다 반복 할 for-each 루프 가 필요한 경우 클래스는 Iterable 인터페이스를 구현해야합니다 . 그러나 for-each 루프는 컬렉션을 순방향으로 순환하는 데만 사용할 수 있으며이 컬렉션의 요소는 수정할 수 없습니다 . 그러나 원하는 모든 요소 데이터를 읽는 것이라면 매우 간단하며 Java 람다 식 덕분에 종종 하나의 라이너입니다. 예를 들면 다음과 같습니다.

iterableElements.forEach (x -> System.out.println(x) );

반복자

이 인터페이스를 사용하면 컬렉션을 반복하면서 해당 요소를 가져오고 제거 할 수 있습니다. 각 컬렉션 클래스는 반복자를 컬렉션의 시작 부분으로 반환하는 iterator () 메서드를 제공합니다. iterable에 비해이 인터페이스의 장점은이 인터페이스 를 사용하여 컬렉션의 요소를 추가, 수정 또는 제거 할 수 있다는 것입니다 . 그러나 요소에 액세스하려면 반복 가능한 것보다 약간 더 많은 코드가 필요합니다. 예를 들면 다음과 같습니다.

for (Iterator i = c.iterator(); i.hasNext(); ) {
       Element e = i.next();    //Get the element
       System.out.println(e);    //access or modify the element
}

출처 :

  1. Java Doc Iterable
  2. 자바 문서 반복자

0

Iterable 자바의 각 루프에 사용하기 위해 도입되었습니다.

public interface Collection<E> extends Iterable<E>  

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


SO에 오신 것을 환영합니다. 항상 여기를 방문 하여 답변을보다 유용하고 깨끗하게 만들 수 있습니다. 우리의 경우 질문은 두 클래스에 대한 설명을 요구하지만, 당신의 대답은 문제를 해결하는 대신 상당히 혼란 스럽습니다. 또한 알려진 / 유효한 / 인증 된 출처의 스 니펫을 게시하는 동안 참조를 유지하여 답변을보다 구체적으로 만드십시오.
AntJavaDev
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.