Java에서 컬렉션을 학습 할 때, 컬렉션 계층 루트 인터페이스 컬렉션은 반복 가능한 <t> 인터페이스 (java.lang 패키지에 위치)를 구현하여 객체가 "foreach"문의 대상이 될 수 있습니다. 이 인터페이스의 유일한 방법은 T- 타입 요소 세트에서 반복하는 반복기를 반환하는 것입니다.
1. 반복자
인터페이스 : 반복자 <t>
공개 인터페이스 반복자 <e> {boolean hasnext (); e 다음 (); 무효 제거 (); }반복자 인터페이스 API를 살펴보면 컬렉션을 반복하는 반복자라는 것을 알 수 있습니다. 반복기를 통해 발신자는 잘 정의 된 의미를 사용하여 반복하는 동안 반복 기간에 의해 컬렉션에서 요소를 제거 할 수 있습니다.
이 반복자 remove () 메소드가 사용된다는 것이 특히 주목할 만하다. 반복자가 반복자가 가리키는 컬렉션에서 반복자가 반환 한 마지막 요소를 제거하십시오 (선택적 작동). 이 방법은 다음에 전화 당 한 번만 호출 할 수 있습니다. 반복 할 때이 메소드 (제거 메소드)를 호출하는 것보다 반복자가 가리키는 컬렉션이 다른 방식으로 수정되면 반복자의 동작은 불확실합니다. 반복자 <T> 인터페이스를 설계 할 때 인터페이스 디자이너는 반복 할 때 반복 () 메소드를 제외한 remove () 메소드를 제외하고 반복자가 컬렉션을 수정하면 불확실한 결과를 초래할 것이라고 지적했습니다. 반복자의 특정 구현에 따라 결과는 무엇입니까? 이 불확실한 결과의 가능한 상황에 응답하여, 배열 목록을 학습 할 때 그 중 하나가 발생했습니다. 반복자는 동시 모듈화 외 예외를 던졌습니다. 특정 예외는 다음 코드에 표시됩니다.
import java.util.arraylist; import java.util.collection; import java.util.iterator; public class itaratortest {public static void main (string [] args) {collection <string> list = new arraylist <string> (); list.add ( "Android"); list.add ( "ios"); list.add ( "Windows Mobile"); iterator <string> iterator = list.iterator (); while (iterator.hasnext ()) {String lang = iterator.next (); list.remove (lang); // 동시 모듈화 exception을 던질 것입니다}}} 이 코드는 ITERATOR의 실행 중에 요소를 삭제하기 위해 ITERATOR의 remove () 메서드를 사용하지 않고 대신 arraylist의 remove () 메소드를 사용하여 반복자가 가리키는 컬렉션을 변경하기 때문에 실행 중에 동시 모듈화 지출 예외 예외를 던집니다. 이것은 반복자의 설계 원칙을 위반하므로 예외가 발생합니다.
보고 된 이상은 다음과 같습니다.
스레드의 예외 "main"java.util.concurrentModificationException의 예외
at java.util.arraylist $ ittr.checkforcomodification (arraylist.java:859)
at Java.util.arraylist $ ittr.next (Arraylist.java:831)
at text.itaratortest.main (itaratortest.java:17)
2. 각각의 루프 및 반복자 반복자 <t>
Java 5에서 시작하여 Java에는 수집 및 배열을 통해 루프하는 데 사용할 수 있습니다. Foreach Loops를 사용하면 루프를 위해 전통적인 인덱스를 유지하지 않고 hasnext () 메소드에서 hasnext () 메소드를 호출하지 않고 컬렉션을 통과 할 수 있습니다. for-each 루프는 모든 수집 또는 배열의 트래버스 프로세스를 단순화합니다. 그러나 Foreach 루프를 사용할 때주의를 기울여야 할 두 가지 점이 있습니다.
Foreach 루프를 사용하는 객체는 반복 가능한 <t> 인터페이스를 구현해야합니다.
다음 예를 참조하십시오.
import java.util.arraylist; public class foreachtest1 {public static void main (String args []) {customCollection <string> myCollection = new CustomCollection <문자열> (); myCollection.add ( "Java"); myCollection.add ( "Scala"); myCollection.add ( "Groovy"); //이 코드는 무엇을하고, 언어를 인쇄하거나, 예외를 던지거나 // // (문자열 언어 : myCollection) {system.out.println (언어); }} private class customCollection <t> {private arraylist <t> 버킷; public customCollection () {bucket = new ArrayList (); } public int size () {return bucet.size (); } public boolean isempty () {return bucket.isempty (); } public boolean은 (t o) {return buct.contains (o); } public boolean add (t e) {return buct.add (e); } public boolean remove (t o) {return buct.remove (o); }}} 코드의 CustomCollection 클래스가 반복 가능한 <t> 인터페이스를 구현하지 않기 때문에 위의 코드는 컴파일되지 않으며 컴파일 기간 동안보고 된 오류는 다음과 같습니다.
스레드의 예외 "main"java.lang.error : 해결되지 않은 컴파일 문제 :
배열 또는 java.lang.iterable 인스턴스를 반복 할 수 있습니다.
at text.foreachtest1.main (foreachtest1.java:15)
실제로 오류를 찾기 위해 컴파일 될 때까지 기다릴 필요가 없습니다. Eclipse는 코드가 완료된 후 Foreach 루프에 오류가 표시됩니다. 배열 또는 java.lang.tertable 인스턴스를 반복 할 수 있습니다.
위의 예에서 Foreach 루프는 반복 가능한 <t> 인터페이스를 구현하는 객체에만 적용 가능하다는 것을 다시 확인할 수 있습니다. 모든 내장 컬렉션 클래스는 java.util.collection 인터페이스를 구현하고 위의 문제를 해결하기 위해 CustomCollection을 활성화하여 컬렉션 인터페이스를 구현하거나 AbstractCollection을 상속 할 수 있도록 선택할 수 있습니다. 솔루션은 다음과 같습니다.
import java.util.abstractcollection; import java.util.arraylist; import java.util.iterator; public class foreachtest {public static void main (String args []) {customCollection <string> mycollection = new CustomCollection <string> (); myCollection.add ( "Java"); myCollection.add ( "Scala"); myCollection.add ( "Groovy"); for (문자열 언어 : myCollection) {System.out.println (언어); }} private static class customCollection <t> acpractCollection <t> {private arraylist <t> 버킷; public customCollection () {bucket = new ArrayList (); } public int size () {return bucet.size (); } public boolean isempty () {return bucket.isempty (); } public boolean cotains (object o) {return buct.contains (o); } public boolean add (t e) {return buct.add (e); } public boolean remove (object o) {return buct.remove (o); } @override public iterator <t> iterator () {// todo 자동 생성 메소드 스터브 리턴 버킷. eritator (); }}}2. Foreach 루프의 내부 구현은 또한 반복자에 의해 구현됩니다.
Foreach 루프가 반복기를 내부 구현으로 사용한다는 사실을 확인하기 위해이 기사의 초기 예제를 사용하여 다음을 확인합니다.
public class itaratortest {public static void main (string [] args) {collection <string> list = new arraylist <string> (); list.add ( "Android"); list.add ( "ios"); list.add ( "Windows Mobile"); // example1 // iterator <string> iterator = list.iterator (); // while (iterator.hasnext ()) {// string lang = iterator.next (); // list.remove (lang); //} // 예제 (문자열 언어 : list) {list.remove (언어); }}} 프로그램이 실행될 때보고 된 예외 :
스레드의 예외 "main"java.util.concurrentModificationException의 예외
at java.util.arraylist $ ittr.checkforcomodification (arraylist.java:859)
at Java.util.arraylist $ ittr.next (Arraylist.java:831)
at text.itaratortest.main (itaratortest.java:22)
이 예외는 For-Each Loop이 ITERATOR를 사용하여 컬렉션을 반복하여 iterator.next ()라고 불리며 (요소)를 확인하고 동시 모듈화 exception을 던집니다.
요약 :
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.