В чем разница между стандартным циклом while(true)
и for(;;)
?
Есть ли какой-либо файл или оба будут сопоставлены с одним и тем же байт-кодом после компиляции?
В чем разница между стандартным циклом while(true)
и for(;;)
?
Есть ли какой-либо файл или оба будут сопоставлены с одним и тем же байт-кодом после компиляции?
Семантически, они полностью эквивалентны. Это вопрос вкуса, но я думаю, что while(true)
выглядит чище, и его легче читать и понимать на первый взгляд. В Java ни один из них не вызывает предупреждения компилятора.
На уровне байт-кода это может зависеть от компилятора и уровня оптимизации, но в принципе испускаемый код должен быть одним и тем же.
EDIT:
В моем компиляторе, используя плагин Bytecode Outline, байт-код для for(;;){}
выглядит следующим образом:
L0
LINENUMBER 6 L0
FRAME SAME
GOTO L0
И байт-код для while(true){}
выглядит следующим образом:
L0
LINENUMBER 6 L0
FRAME SAME
GOTO L0
Так что да, по крайней мере для меня, они одинаковы.
Это вам, какой из них использовать. Потому что они равны компилятору.
создать файл:
// first test
public class Test {
public static void main(String[] args) {
while (true) {
System.out.println("Hi");
}
}
}
компиляции:
javac -g:none Test.java
rename Test.class Test1.class
создать файл:
// second test
public class Test {
public static void main(String[] args) {
for (;;) {
System.out.println("Hi");
}
}
}
компиляции:
javac -g:none Test.java
mv Test.class Test2.class
сравнить:
diff -s Test1.class Test2.class
Files Test1.class and Test2.class are identical
В Oracle Java 7 вы получаете одинаковый код байта. Вы не можете указать из байтового кода, который использовался в оригинале. Лучше всего это вопрос вкуса. Я использую while(true)
Он объединяется с одним и тем же байтовым кодом, и это вопрос вкуса, который вы предпочитаете.
Я прочитал много исходного кода из распределенного JDK Oracle, и я не могу с легкостью вспомнить, что я видел инструкцию while(true)
в своем коде, но я видел в своем коде множество операторов for(;;)
, Я лично, я предпочитаю for(;;)
, и мои рассуждения немного похожи на это:
Цикл while должен содержать логическое выражение, а не логическую константу. while(true)
немного похож на if(true)
, оба из которых, я думаю, стали законными только для дополнительного комфорта масс. Пустое while()
не компилируется. Добавление true
там немного похоже на взлом.
for(;;)
, с другой стороны, представляет собой "реальный цикл", хотя и пустой. Кроме того, это сэкономит вам пару нажатий клавиш! =) (не так уж и важно)
Поэтому, и я знаю, что это звучит безумно, но хотя (правда) лучше читается на английском языке, я думаю, что для (;;) лучше выразить свои намерения и более сродни языку программирования Java. В любом случае следует избегать вечных циклов. Когда я читаю (;;), я чувствую себя в безопасности, зная, что разработчик где-то тормозит путь исполнения. Когда я читаю (правда), я просто не могу быть уверенным. Но эй, может быть, только я! Мы все можем выбрать собственный вкус.
В зависимости от компилятора он должен сопоставляться с одним и тем же байтовым кодом.
JVM найдет лучший способ сделать байт-код и в обоих случаях должен сделать то же самое. Так что я думаю, что нет никакой разницы. while (true) просто красивее.
Функционально нет разницы. Любая эффективность, полученная или потерянная разницей в байт-коде, вероятно, будет незначительной по сравнению с любой инструкцией, которую вы выполняете в теле цикла.
Я посмотрел на сгенерированный байт-код и обнаружил, что, поскольку условие всегда true (во время компиляции), компилятор скомпилирует тест и просто ветвь всегда вернется в начало петля. Я предполагаю, что оператор продолжить также будет делать ветвь всегда назад в начало цикла. Таким образом, это не только не имеет никакого значения, но и никакого кода для тестирования ничего не существует.