답변:
이해를 돕기 위해 ArrayList에 대한 질문에 대한 예를 들어 설명하겠습니다.
public interface Iterable { ... abstract Iterator<T> iterator(); //Returns an 'Iterator'(not iterator) over elements of type T. ... }
public interface Iterator { ... abstract boolean hasNext(); //Returns true if the iteration has more elements. abstract E next(); //Returns the next element in the iteration. ... }
'반복 가능 <-Collection <-List <-ArrayList'
. Iterable, Collection 및 List는 추상 메소드 '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]; } ... } }
다음은 간단한 예입니다.
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<T>
이 시나리오에서 반환 유형이 인 메소드를 작성하려면 어떤 단계를 구현해야합니까? 그 예도 제안하십시오.
콜렉션이 반복 가능한 경우, 반복자를 사용하여 반복 할 수 있습니다 (따라서 각 루프에 사용할 수 있습니다). 반복자는 콜렉션을 반복하는 실제 오브젝트입니다.
java.lang.Iterable
않습니까?
java.lang.Iterable
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을 되 감을 수 있기 때문에 반복자를 되 감는 방법이 없기 때문입니다.
사과가 10 개인 예를 생각해보십시오. Iterable을 구현할 때 각 사과를 1에서 10 사이의 상자에 넣고 탐색하는 데 사용할 수있는 반복자를 반환하는 것과 같습니다.
반복자를 구현하면 다음 상자에 모든 사과, 사과를 얻을 수 있습니다.
따라서 iterable을 구현하면 반복자가 요소를 탐색 할 수 있지만 반복자는 반복자를 구현해야합니다.
질문 : Iterable과 Iterator의 차이점은 무엇입니까?
답변 :
iterable : forEach 루프
iterator와 관련이 있습니다 : Collection과 관련이 있습니다
forEach 루프의 대상 요소는 반복 가능해야합니다.
Iterator를 사용하여 Collection에서 객체를 하나씩 가져올 수 있습니다.
java.ḷang 패키지에있는 반복 가능
java.util 패키지에 있는 반복 가능
iterator () 메소드를 하나만 포함합니다
hasNext (), next (), remove () 메소드를 포함합니다
1.5 버전으로
소개 1.2 버전으로 소개
기본적으로, 둘 다 서로 밀접하게 관련되어 있습니다.
Iterator 는 hasNext (), 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
나는 이것이 오래된 질문이라는 것을 알고 있지만, 같은 질문에 갇혀 있고 모든 용어에 압도적 인 사람을 위해이 반복문과 반복자 사이 의이 구별을 이해하는 데 도움이되는 훌륭하고 간단한 비유가 있습니다.
공공 도서관을 생각하십시오. 오래된 학교. 종이 책과 함께. 예, 그런 종류의 도서관.
책으로 가득 찬 선반은 반복 가능한 것과 같습니다. 선반에서 긴 줄의 책을 볼 수 있습니다. 당신은 얼마나 많은 것을 알지 못하지만, 그것이 긴 책 모음임을 알 수 있습니다.
사서는 반복자와 같습니다. 그는 언제든지 특정 책을 가리킬 수 있습니다. 그는 자신이 가리키는 위치에서 책을 삽입 / 제거 / 수정 / 읽을 수 있습니다. 그는 "다음!"을 외칠 때마다 순서대로 각 책을 가리 킵니다. 그에게. 그래서, 당신은 일반적으로 그에게 다음과 같이 물어볼 것입니다 : "다음이 있습니까?" 그는 다음 책을 가리킬 것입니다. 그는 또한 선반 끝에 도달했을 때를 알고 있으므로 다음과 같이 물을 때 "다음이 있습니까?" 그는 "아니오"라고 말할 것입니다.
조금 어리 석다는 것을 알고 있지만 이것이 도움이되기를 바랍니다.
간단히 말해서 Iterable 과 Iterator 는 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
}
출처 :
Iterable
자바의 각 루프에 사용하기 위해 도입되었습니다.
public interface Collection<E> extends Iterable<E>
Iterator
에 대한 반복을 관리하는 클래스입니다 Iterable
. 현재 반복 위치의 상태를 유지하고 다음 요소가 무엇이며 어떻게 얻을 수 있는지 알고 있습니다.
Iterable
이interal
또는external
반복자하거나이 가능 그들 중 어떤이가?