Beim Erlernen der Sammlung in Java ist mir aufgefallen, dass die Root-Schnittstelle Collection der Sammlungsebene die Iterable
1. Iterator Iterator
Schnittstelle: Iterator
public interface Iterator<E>{ boolean hasNext(); E next(); void remove(); }
Wenn Sie sich die Iterator-Schnittstellen-API ansehen, können Sie es wissen dass dies ein Iterator zum Durchlaufen der Sammlung ist. Iteratoren ermöglichen es dem Aufrufer, mithilfe einer genau definierten Semantik Elemente aus der Sammlung zu entfernen, auf die der Iterator während der Iteration zeigt.
Besonders hervorzuheben ist die Verwendung der Methode „remove()“ dieses Iterators: Entfernen des letzten vom Iterator zurückgegebenen Elements (optionale Operation) aus der Sammlung, auf die der Iterator zeigt. Diese Methode kann nur einmal pro Aufruf von next aufgerufen werden. Wenn die Sammlung, auf die der Iterator zeigt, während einer Iteration anders als durch den Aufruf dieser Methode (Remove-Methode) geändert wird, ist das Verhalten des Iterators undefiniert. Der Schnittstellendesigner hat beim Entwerfen der Iterator
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);//will throw ConcurrentModificationException } } }
Dieser Code löst beim Ausführen eine ConcurrentModificationException-Ausnahme aus, da wir während des Iterators keine Verwendung haben Führen Sie die Methode „remove()“ von Iterator aus, um Elemente zu löschen, verwenden Sie jedoch die Methode „remove()“ von ArrayList, um die Sammlung zu ändern, auf die der Iterator zeigt. Dies verstößt gegen die Designprinzipien von Iteratoren, sodass eine Ausnahme auftritt.
Die gemeldete Ausnahme lautet wie folgt:
Ausnahme im Thread „main“ java.util.ConcurrentModificationException
bei java.util.ArrayList$Itr.checkForComodification ( ArrayList.java:859)
bei java.util.ArrayList$Itr.next(ArrayList.java:831)
bei Text.ItaratorTest.main(ItaratorTest.java:17)
2. for-each-Schleife und Iterator Iterator
Ab Java5 gibt es in Java eine for-each-Schleife, mit der Sammlungen und Arrays durchlaufen werden können. Mit der Foreach-Schleife können Sie die Sammlung durchlaufen, ohne den Index in einer herkömmlichen for-Schleife verwalten zu müssen oder ohne die hasNext()-Methode in der while-Schleife aufzurufen, wenn Sie iterator / ListIterator (eine Iteratorimplementierung in ArrayList) verwenden. Die for-each-Schleife vereinfacht das Durchlaufen einer Sammlung oder eines Arrays. Bei der Verwendung einer foreach-Schleife sind jedoch zwei Punkte zu beachten.
Objekte, die eine foreach-Schleife verwenden, müssen die Iterable
Bitte sehen Sie sich das folgende Beispiel an:
import java.util.ArrayList; public class ForeachTest1 { public static void main(String args[]) { CustomCollection<String> myCollection = new CustomCollection<String>(); myCollection.add("Java"); myCollection.add("Scala"); myCollection.add("Groovy"); // What does this code will do, print language, throw exception or // compile time error for (String language : myCollection) { System.out.println(language); } } private class CustomCollection<T> { private ArrayList<T> bucket; public CustomCollection() { bucket = new ArrayList(); } public int size() { return bucket.size(); } public boolean isEmpty() { return bucket.isEmpty(); } public boolean contains(T o) { return bucket.contains(o); } public boolean add(T e) { return bucket.add(e); } public boolean remove(T o) { return bucket.remove(o); } } }
Der obige Code wird nicht kompiliert, da die CustomCollection-Klasse im Code die Iterable
Ausnahme im Thread „. main" java .lang.Error: Ungelöstes Kompilierungsproblem:
Kann nur über ein Array oder eine Instanz von java.lang.Iterable
bei Text.ForeachTest1.main(ForeachTest1.java:15)< iterieren 🎜>
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 (String language : myCollection) { System.out.println(language); } } private static class CustomCollection<T> extends AbstractCollection<T> { private ArrayList<T> bucket; public CustomCollection() { bucket = new ArrayList(); } public int size() { return bucket.size(); } public boolean isEmpty() { return bucket.isEmpty(); } public boolean contains(Object o) { return bucket.contains(o); } public boolean add(T e) { return bucket.add(e); } public boolean remove(Object o) { return bucket.remove(o); } @Override public Iterator<T> iterator() { // TODO Auto-generated method stub return bucket.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"); // example1 // Iterator<String> iterator = list.iterator(); // while (iterator.hasNext()) { // String lang = iterator.next(); // list.remove(lang); // } // example 2 for (String language : list) { list.remove(language); } } }
bei java.util.ArrayList$Itr.checkForComodification(ArrayList.java:859)
bei java.util.ArrayList$Itr.next( ArrayList.java:831)
bei Text .ItaratorTest.main(ItaratorTest.java:22)
Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass er zum Lernen aller beiträgt. Ich hoffe auch, dass jeder die PHP-Chinesisch-Website unterstützt.
Ausführlichere Artikel zu for-each-Schleifen und Iterationen in JAVA finden Sie auf der chinesischen PHP-Website!