При обучении коллекции в Java отмечается, что коллекция корневых интерфейсов иерархии иерархии реализует итерабильный интерфейс <t> (расположенный в пакете java.lang), который позволяет объектам стать целью оператора «Foreach». Единственный способ в этом интерфейсе-вернуть итератор, который итерация на наборе элементов Т-типа.
1. Итератор
Интерфейс: итератор <T>
Общественный интерфейс итератор <e> {boolean hasnext (); E Next (); void remove (); }Глядя на API интерфейса итератора, вы можете знать, что это итератор, который итерация в коллекции. Итератор позволяет абоненту удалять элементы из коллекции, на которую указывают итератор во время итерации с использованием четко определенной семантики.
Особенно примечательно, что используется этот метод итератора remove (): удалить последний элемент, возвращаемый итератором, из коллекции, на который указан итератор (необязательная операция). Этот метод может быть вызван только один раз за вызов следующим образом. Если коллекция, на которую указывает итератор, изменяется другими способами, чем вызов этого метода (удалить метод) при итерации, поведение итератора неясно. При проектировании интерфейса итератора <t> дизайнер интерфейса отметил, что при итерации, если метод remote (), кроме итератора, вызван и сборы, на которую указывает итератор, он будет вызывать неопределенные последствия. Каковы последствия в зависимости от конкретной реализации итератора. В ответ на возможные ситуации этого неопределенного последствия, один из них встречался при обучении ArrayList: итератор бросает исключение CondurentModificationException. Конкретные исключения показаны в следующем коде:
Import java.util.arraylist; import java.util.collection; import java.util.iterator; открытый класс 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); // выбросит concurrentmodificationexception}}} Этот код будет выбросить исключение ConcurrentModificationException при запуске, потому что мы не используем метод remost () rement () для удаления элемента во время прогона итератора, а вместо этого используем метод remove () ArrayList для изменения коллекции, указанного на итератор. Это нарушает принципы дизайна итератора, поэтому происходит исключение.
Сообщаемая аномалия заключается в следующем:
Исключение в потоке "Main" java.util.concurrentModificationException
на java.util.arraylist $ ittr.checkforcomodification (arraylist.java:859)
на java.util.arraylist $ ittr.next (arraylist.java:831)
at text.itaratortest.main (itaratortest.java:17)
2. за свой цикл и итератор и итератор <t>
Начиная с Java 5, в Java существует целая петля, которую можно использовать для завора с помощью коллекции и массива. Процессы Foreach позволяют вам пройти сборы, не вызывая метод hasnext () в цикле while, не сохраняя индекс в традиционном цикле, или не используя итератор /листика (реализация итератора в ArrayList). Формальный цикл упрощает процесс обхода любого сбора или массива. Тем не менее, есть два пункта, на которые можно обратить внимание при использовании петлей Foreach.
Объекты, которые используют петли Foreach, должны реализовать итерабильный интерфейс <t>
Пожалуйста, смотрите следующий пример:
import java.util.arraylist; открытый класс foreachtest1 {public static void main (string args []) {customCollection <string> myCollection = new CustomCollection <String> (); mycollection.add ("java"); mycollection.add ("scala"); MyCollection.Add ("Groovy"); // Что будет делать этот код, печатать язык, исключение, исключение или // ошибка компиляции для (строковый язык: mycollection) {System.out.println (язык); }} частный класс 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 содержит (t o) {return bucket.contains (o); } public boolean add (t e) {return bucket.add (e); } public boolean remove (t o) {return bucket.remove (o); }}} Приведенный выше код не будет составлен, поскольку класс CustomCollection в коде не реализует итерабильный интерфейс <t>, а ошибка, представленная в течение периода компиляции, заключается в следующем:
Исключение в потоке "Main" java.lang.error: неразрешенная проблема компиляции:
Может итерация только над массивом или примером java.lang.iterable
at text.foreachtest1.main (foreachtest1.java:15)
На самом деле, нет необходимости ждать, пока компиляция, чтобы найти ошибку. Eclipse отобразит ошибку в цикле Foreach после завершения кода: может итерация только над массивом или экземпляром java.lang.iterable
Из приведенного выше примера можно подтвердить, что цикл Foreach применим только к объектам, которые реализуют итерабильный интерфейс <t>. Поскольку все встроенные классы коллекций реализуют интерфейс java.util.collection и унаследовали итерабильные, чтобы решить вышеуказанную проблему, вы можете просто включить CustomCollection для реализации интерфейса коллекции или наследовать абстракцию. Решение заключается в следующем:
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"); для (строковый язык: mycollection) {System.out.println (язык); }} частный статический класс CustomCollection <T> расширяет 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 содержит (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 Автогенерированный метод заглушка return bucket.iterator (); }}}2. Внутренняя реализация цикла Foreach также реализована итератором.
Чтобы проверить тот факт, что цикл Foreach использует итератор в качестве внутренней реализации, мы все равно используем начальный пример этой статьи для проверки:
открытый класс iTaratorTest {public static void main (string [] args) {collection <string> list = new ArrayList <string> (); list.add ("Android"); list.add ("ios"); list.add ("Windows Mobile"); // Пример1 // iterator <string> iterator = list.iterator (); // while (iterator.hasnext ()) {// string lang = iterator.next (); // list.remove (lang); //} // Пример 2 для (строковый язык: list) {list.remove (language); }}} Исключение сообщено, когда программа работает:
Исключение в потоке "Main" java.util.concurrentModificationException
на java.util.arraylist $ ittr.checkforcomodification (arraylist.java:859)
на java.util.arraylist $ ittr.next (arraylist.java:831)
at text.itaratortest.main (itaratortest.java:22)
Это исключение только показывает, что в течение своего цикла использует итератор для итерации через коллекцию, которая также называет iterator.next (), который проверяет (элемент) изменения и бросает coundrentModificationException.
Суммировать:
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.