나는 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에 대한 질문에 대한 예를 들어 설명하겠습니다.
- 반복 가능한 인터페이스는 서브 클래스가 추상 메소드 ‘iterator ()’를 구현하도록합니다.
public interface Iterable { ... abstract Iterator<T> iterator(); //Returns an 'Iterator'(not iterator) over elements of type T. ... }
- 반복자 인터페이스는 서브 클래스가 추상 메소드 ‘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. ... }
- ArrayList는 List를 구현하고 List는 Collection을 확장하고 Collection은 Iterable을 확장합니다. 즉, 다음과 같은 관계를 볼 수 있습니다.
‘반복 가능 <-Collection <-List <-ArrayList’
. Iterable, Collection 및 List는 추상 메소드 ‘iterator ()’를 선언하고 ArrayList만으로 구현합니다.
- 자세한 내용은 다음과 같이 ‘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]; } ... } }
- 다른 메소드 또는 클래스는 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 에 대한 반복을 관리하는 클래스입니다 . 현재 반복 위치의 상태를 유지하고 다음 요소가 무엇이며 어떻게 얻을 수 있는지 알고 있습니다.