在JDK8u的jdk項目下作個很粗略的搜索:java
mymbp:/Users/me/workspace/jdk8u/jdk/src $ egrep -nr "for \\(\\s?;\\s?;". | wc -l 369 mymbp:/Users/me/workspace/jdk8u/jdk/src $ egrep -nr "while \\(true". | wc -l 323
並無差多少優化
其次,for (;😉 在Java中的來源。我的見解是喜歡用這種寫法的人,追根溯源是受到C語言裏的寫法的影響。這些人不必定是本身之前寫C習慣了這樣寫,而多是間接受之前寫C的老師、前輩的影響而習慣這樣寫的。spa
在C語言裏,若是不include某些頭文件或者本身聲明的話,是沒有內建的Bool / bool類型,也沒有TRUE / FALSE / true / false這些Bool / bool類型值的字面量的。因此,假定沒有include那些頭文件或者本身define出上述字面量,一個不把循環條件寫在while (...)括號裏的while語句,最多見的是這樣:code
while(1) { /* ... */ }
…但不是全部人都喜歡看到那個魔數「1」的。編譯器
而用for (;;)來表達不寫循環條件(也就是循環體內不用break或goto就會是無限循環)則很是直觀——這就是for語句自己的功能,並且不須要寫任何魔數。因此這個寫法就流傳下來了。編譯
順帶一提,在Java裏我是傾向於寫while (true)的,不過我也不介意別人在他們本身的項目裏寫for (;😉。效率
至於Java裏while (true)與for (;;)哪一個「效率更高」jdk
這種規範沒有規定的問題,答案都是「看實現」,畢竟實現只要保證語義符合規範就好了,而效率並不在規範管得着的範疇內。搜索
首先看javac對下面倆語句的編譯結果循環
以Oracle/Sun JDK8u / OpenJDK8u的實現來看:
publicvoid foo() { int i = 0; while(true) { i++; } } /* public void foo(); Code: stack=1, locals=2, args_size=1 0: iconst_0 1: istore_1 2: iinc 1, 1 5: goto 2 */
與
publicvoid bar() { int i = 0; for(;;) { i++; } } /* public void bar(); Code: stack=1, locals=2, args_size=1 0: iconst_0 1: istore_1 2: iinc 1, 1 5: goto 2 */
連javac這種幾乎什麼優化都不作(只作了Java語言規範規定必定要作的常量摺疊,和很是少許別的優化)的編譯器,對上面倆版本的代碼都生成了同樣的字節碼。後面到解釋執行、JIT編譯之類的就不用說了,輸入都同樣,輸出也不會不一樣。