Лучшая практика в цикле `For` в Java [дубликаты]

Possible Duplicate:
for loop optimization

В Java у меня есть блок кода:

<code>List e = {element1, element2, ...., elementn};
for(int i = 0; i < e.size(); i++){//Do something in here
};
</code>

и еще один блок:

<code>List e = {element1, element2, ...., elementn};
int listSize = e.size();
for(int i = 0; i < listSize; i++){//Do something in here
};
</code>

Я думаю, что второй блок лучше, потому что в первом блоке, еслиi++мы должны рассчитатьe.size() еще раз, чтобы сравнить состояние вfor петля. Это правильно или неправильно? И сравнивая два блока выше, для чего лучше всего писать? И почему? Объясните и попробуйте этот цикл самостоятельно

Ответы на вопрос(12)

HotSpot переместит e.size () из цикла в большинстве случаев. Таким образом, он будет рассчитывать размер списка только один раз.

Что касается меня, я предпочитаю следующие обозначения:

for (Object elem: e) {
   //Do something
}

Я бы всегда использовал (если вам нужна индексная переменная):

List e = {element1, element2, ...., elementn};
for(int i = 0, size = e.size(); i < size; i++){
    // Do something in here
};

посколькуe.size() может быть дорогой операцией.

Ваш второй вариант не годится, так как он вводит новую переменную внеfor петля. Я рекомендую держать переменную видимость как можно более ограниченной.

В противном случае

for (MyClass myObj : list) {
    // Do something here
}

даже чище, но может привести к небольшому падению производительности (индексный подход не требует создания экземпляраIterator).

Лично я бы вместо этого использовал расширенный оператор for:

for (Object element : e) {
    // Use element
}

Если только ты неneed Индекс, конечно.

Если яhad чтобы использовать одну из двух форм, я буду использовать первую в качестве более позднего (она не вводит другую локальную переменную, которая используется только в этом цикле), пока у меня не будет конкретных доказательств того, что она вызывает проблему. (В большинстве реализаций спискаe.size() простой доступ к переменной, который в любом случае может быть встроен JIT.)

Да, вторая форма немного более эффективна, так как вы не повторяетеsize() вызов метода. Компиляторы хорошо делают такую оптимизацию сами.

However, it's unlikely that this would be the performance bottleneck of your application. Избегайте преждевременной оптимизации, Сделайте ваш код чистым и читаемым в первую очередь.

Обычно самый короткий и читаемый код - лучший выбор, при прочих равных условиях. В случае Java, расширенный цикл for (который работает с любым классом, который реализуетIterable) это путь.

for (Object object : someCollection) { // do something }

Что касается только тех двух, которые вы опубликовали, я думаю, что первый - лучший вариант. Это более читабельно, и вы должны помнить, что JIT попытается оптимизировать большую часть кода, который вы пишете, в любом случае.

EDIT: Вы слышали фразу «преждевременная оптимизация - корень всего зла»? Ваш второй блок - пример преждевременной оптимизации.

Я не уверен, но я думаю, что оптимизатор Java заменит значение статическим значением, так что в конце оно будет таким же.

вторая лучше, потому что в первом цикле в теле, может быть, вы сделаете это утверждение e.remove, и тогда размер e будет изменен, поэтому лучше сохранить размер в параметре перед циклом

Второй подход лучше, потому что в первом блоке вы вызываетеe.size() это метод, который представляет собой операцию в цикле, которая является дополнительной нагрузкой для JVM.

Если вы проверите реализацию size () наLinkedList класс, вы обнаружите, что размер увеличивается или уменьшается при добавлении или удалении элемента из списка. призваниеsize() просто возвращает значение этого свойства и не требует каких-либо расчетов.
Так что прямой вызов метода size () должен быть лучше, так как вы сэкономите на сохранении для другого целого числа.

Я думаю, что сейчас у нас есть тенденция писать короткий и понятный код, поэтому первый вариант лучше.

Чтобы избежать всей этой нумерации, а также итераторов и проверок при написании кода, используйте следующий простой наиболее читаемый код, который имеет максимальную производительность. Почему это имеет максимальную производительность (подробности уточняются)

for (Object object : aCollection) { 
// Do something here
}

Если индекс нужен, то:
Чтобы выбрать между двумя вышеупомянутыми формами:
Второй, как вы сказали, лучше, потому что размер рассчитывается только один раз.

я думаю, что это должно быть намного лучше .. может инициализировать переменную int каждый раз, когда можно экранировать из этого ..

List e = {element1, element2, ...., elementn};
int listSize = e.size();
int i=0;
for(i = 0; i < listSize; i++){//Do something in here
};

ВАШ ОТВЕТ НА ВОПРОС