WebClub - Всероссийский Клуб Веб-разработчиков
WebClub.RU » Архив » Циклы

Циклы


Дата публикации: 17-03-2013

Вы можете думать, что такого особенного в циклах, что этому посвящена целая статья? Ну что ж, просто ответьте на следующий простой вопрос. Если вы сможете ответить, то можете дальше не читать. Если нет, то читайте.

Вопрос: Сколько раз будет напечатано "end(): Invoked"?



/**
* Understanding the for loop.
*/
public class ForLoopTest {

/**
* Start of loop.
*/
public int start() {
System.out.println("start(): Invoked");
return 0;
}

/**
* End of loop condition.
*/
public int end() {
System.out.println("end(): Invoked");
return 5;
}

/**
* Main.
*/
public static void main(String[] args) {

ForLoopTest fl = new ForLoopTest();
for(int i = fl.start(); i < fl.end(); i++) {
System.out.println("main(): i = " + i);
}

}

}
Я знаю, что это выглядит просто, но некоторые из вас будут удивлены, тем, что оно будет распечатано 6 раз (да-да, не 5-ть). Ну что же, эта статья так же и для тех, кто думал, что оно распечатается один раз.

Что же там произошло на самом деле:

1. Метод start() выполнился один раз для инициализации индекса.
2. До входа в цикл, метод end() отработал для проверки окончания условия.
3. С этого времени, каждая итерация вызывала метод end() во время вычисления выражения условия. И так 5 раз.

Так что, как вы видите результат, но в чем же дело? А дело заключается в том, что такой вызов метода очень дорог. Если ваш цикл совершит несколько сотен итераций вы увидите сколько вы тратите на такие циклы. С другой стороны такой стиль программирования часто используется и наиболее встречаемый пример - метод String::length().

Самое лучшее, что можно посоветовать это завести локальные переменные, в которых хранить значение выхода из цикла. Так что этот цикл должен быть переписан примерно так:


int n = end();
for (int i = start(); i < n; i++) {
// ...
}
Применение такого подхода может сохранить много времени в задачах потребляющих много времени.

Популярное

Не так давно в сети появился новый сервис, под названием Dead Man Zero. Этот сервис сделал...
Рынок социальных площадок уже давно стал стабильным. Несмотря на то, что время от времени...
Artisteer 4 – единственный в своем роде продукт, позволяющий автоматизировать работу над созданием...
Март 2017 (1)
Февраль 2017 (3)
Январь 2017 (1)
Август 2016 (1)
Май 2016 (2)
Ноябрь 2015 (1)

Карта сайта: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41

Друзья сайта

Хотите продать свой сайт?
- Мы быстро и удобно для Вас сможем его купить:
  • Заявка на продажу сайта
  • Раcсматриваем цены на каждый сайт в индивидуальном порядке.

    Случайная цитата

    Cory Dodt:

    "Если называть Python заменой BASIC, то тогда и трансформер Optimus Prime — это только замена грузовика."

    Опрос

    Какими социальными сетями Вы пользуетесь?

    Vkontakte.ru
    Одноклассники
    Мой Мир - mail.ru
    Google Plus
    Facebook
    ЖЖ
    Другие
    Не пользуюсь