Предисловие
Причина введения расширенного для петли: в предыдущих версиях JDK5 более трудно пройти элементы в массиве или коллекции, а также итератор длины или коллекции массива.
Новый синтаксис определяется в JDK5 - расширен для петли, чтобы упростить такие операции. Усовершенствование для петли может использоваться только на массивах или коллекциях, которые реализуют итерабируемые интерфейсы.
Синтаксический формат:
Для (переменная переменная переменная: массив или коллекция, которая должна быть итерацией) {
}
На Java, прохождение коллекций и массивов, как правило, имеют следующие три формы:
for (int i = 0; i <list.size (); i ++) {System.out.print (list.get (i)+",");} iterator iterator = list.iterator (); while (iterator.hasnext ()) {System.out.print (iterator.next () + ",");} для (Integer i: list) {System.out.print (i + ",");} Первый является обычным для пересечения цикла, вторым является использование итераторов для обхода, а третий обычно называется повышенным для цикла (для каждого).
Принцип реализации
Можно видеть, что третья форма - это синтаксический сахар, предоставляемый Java. Здесь мы анализируем, как это усиливается для цикла реализована в базовом уровне.
Мы декомпилируем следующий код:
Для (Integer I: List) {System.out.println (i);}После декомпиляции:
Целое число i; for (iterator iterator = list.iterator (); iterator.hasnext (); System.out.println (i)) {i = (Integer) iterator.next (); } Декомпилированный код на самом деле довольно сложный, поэтому давайте разберем его в порядке исполнения:
Целое число я; определяет временную переменную i
Iterator iterator = list.iterator (); Получите итератор списка
iterator.hasnext (); определяет, есть ли в итераторе нераверные элементы
i = (Integer) iterator.next (); Получите первый нераверный элемент и назначьте его временной переменной I
System.out.println (i) выводит значение временной переменной i
Это циклов до тех пор, пока все элементы в списке не пройдут.
Благодаря декомпиляции мы видим, что базовый уровень усиленных для петель в Java фактически реализуется с помощью итераторной схемы.
Яма усиления для петли
Говорят, что это яма в улучшении петли, но на самом деле это в основном потому, что некоторые люди могут вступить в яму в принципе реализации улучшения для цикла.
Поскольку улучшение цикла реализуется через итератор, оно должно иметь характеристики итератора.
В Java существует неудачный механизм. При использовании итератора для прохождения элементов вы должны быть осторожны при удалении коллекции. Если вы используете его неправильно, может произойти condurentModificationException. Это исключение времени выполнения и не произойдет в течение периода компиляции. Он будет взорваться только тогда, когда программа фактически работает.
Как в следующем коде:
для (студент stu: студенты) {if (stu.getid () == 2) студенты.remove (stu); }Исключение CondurentModificationException будет брошено.
Итератор работает в отдельном потоке и имеет блокировку Mutex. После того, как итератор создан, таблица индекса с одной связкой, указывающая на исходный объект. Когда количество исходных объектов изменяется, содержание этой таблицы индексов не будет изменяться синхронно, поэтому, когда указатель индекса перемещается назад, объект в итерацию не может быть найден, поэтому в соответствии с принципом неудачного, итератор будет сброшен немедленно.
java.util.concurrentModificationException исключение.
Следовательно, итератор не позволяет изменять итерационные объекты, когда он работает.
Но вы можете использовать собственный метод итератора, remove() , чтобы удалить объект. Метод Iterator.remove() будет поддерживать согласованность индекса при удалении текущего итерационного объекта.
Правильно удалить элементы во время прохождения:
Iterator <tlpant> stuiter = Student.iterator (); while (stuiter.hasnext ()) {Student Student = stuiter.next (); if (study.getid () == 2) stuiter.remove (); // Здесь необходимо использовать метод удаления итератора для удаления текущего объекта. Если вы используете метод удаления списка, также появится coundrentModificationException} ОК, здесь я познакомлю вас с принципом реализации улучшения цикла для цикла и подводных камней, в которые вы можете попасть, если вы используете его неправильно. Поэтому, хотя это простой синтаксис, вы также должны понимать его принципы, в противном случае это может привести к некоторым необъяснимым проблемам.
Суммировать
Вышеуказанное - все содержание этой статьи. Я надеюсь, что содержание этой статьи имеет определенную справочную ценность для каждого обучения или работы. Если у вас есть какие -либо вопросы, вы можете оставить сообщение для общения. Спасибо за поддержку Wulin.com.