Java: для (;;) против while (true) - PullRequest
       34

Java: для (;;) против while (true)

60 голосов
/ 16 января 2012

В чем разница между стандартным циклом while(true) и for(;;)?

Есть ли, или оба будут сопоставлены одному и тому же байт-коду после компиляции?

Ответы [ 9 ]

105 голосов
/ 16 января 2012

Семантически они полностью эквивалентны.Это дело вкуса, но я думаю, что while(true) выглядит чище, и его легче читать и понимать с первого взгляда.В Java ни один из них не вызывает предупреждений компилятора.

На уровне байт-кода это может зависеть от компилятора и уровня оптимизации, но в принципе передаваемый код должен быть одинаковым.

РЕДАКТИРОВАТЬ:

На моем компиляторе, используя плагин Outline Outline , байт-код для for(;;){} выглядит следующим образом:

   L0
    LINENUMBER 6 L0
   FRAME SAME
    GOTO L0

ИБайт-код для while(true){} выглядит следующим образом:

   L0
    LINENUMBER 6 L0
   FRAME SAME
    GOTO L0

Так что да, по крайней мере для меня, они идентичны.

25 голосов
/ 16 января 2012

Вам решать, какой из них использовать. Потому что они равны компилятору.

создать файл:

// 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
7 голосов
/ 05 мая 2014

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

Я прочитал много исходного кода из распределенного JDK Oracle, и я не могу легко вспомнить, что я видел оператор while(true) в их коде, но я видел много операторов for(;;) в их коде , Я лично поддерживаю for(;;), и мои рассуждения выглядят примерно так:

В цикле while «следует» требуется логическое выражение, а не логическая константа. while(true) немного похоже на if(true), оба из которых, я думаю, были сделаны законными только для дополнительного удобства масс. Пустой while() не компилируется. Добавление true выглядит как хакерство.

for(;;) с другой стороны, это «реальная петля», хотя и пустая. Кроме того, это экономит вам пару нажатий клавиш! =) ( не то чтобы это имело значение )

Поэтому, и я знаю, что это звучит безумно, но хотя (правда) лучше читает по-английски, я думаю, что для (;;) лучше выразить свои намерения, и это больше похоже на язык программирования Java. В любом случае следует избегать вечных петель. Когда я читаю для (;;), я чувствую себя в безопасности, зная, что разработчик будет где-то тормозить путь выполнения. Когда я читаю while (true), я просто не могу быть в этом уверен. Но, может быть, это только я! Мы все можем выбирать свой вкус.

6 голосов
/ 16 января 2012

В Oracle Java 7 вы получаете тот же байт-код. Вы не можете сказать по байт-коду, который использовался в оригинале. Что лучше, это вопрос вкуса. Я использую while(true)

3 голосов
/ 03 июня 2012

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

3 голосов
/ 16 января 2012

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

3 голосов
/ 16 января 2012

В зависимости от компилятора он должен отображаться на один и тот же байт-код.

2 голосов
/ 16 января 2012

Функционально разницы нет. Любая эффективность, полученная или потерянная из-за разницы в байт-коде, вероятно, будет незначительной по сравнению с любой инструкцией, которую вы выполняете в теле цикла.

1 голос
/ 05 октября 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...