本章節,我們介紹java里的循環,在開始本章節之前,先給大家提出一個問題,比如說,我讓你用print顯示出10條"Hello baby"的信息,你會怎么做呢? 從我們以前所學的知識來看,這很簡單,只需要System.out.println("Hello baby");十次即可。但是我讓你顯示出100次甚至更多呢? 也許你說我是無理取鬧,是的,這個問題本身並沒有實際的意義,但是這樣的問題實際上就是:多次執行相同或者有一定規律的操作。在這種時候,我們需要用到循環。只從語義來講,循環就是do it again and again對吧?但是怎么來做呢?
java里有兩種循環,for循環和while循環,本次,我們先來介紹for循環。
for循環里有兩種,普通for循環和for each循環,后者是java后來加上去的,原本是沒有的。先說普通for循環:
普通for循環的格式是這樣的:
for(初始化條件(一般為數據的初始化); 判斷條件(一般與前面初始化的數據有關); 條件改變(一般改變那個數據))
{執行的操作}(如果執行的操作只有一條語句,花括號可以省略掉,但是建議初學者不要這么做,容易把自己弄糊塗。)
那么,上面這個for循環是怎么執行的呢? 我們來寫個小程序,來說明一下這個問題:
你看,我們打印出了10條Hello baby!對吧?但是到底發生了什么呢?下面我們詳細解釋一下,
for(int i = 0; i < 10; i ++)
{
System.out.println("Hello baby!");
}
i是一個整型數據,在for循環的最最開始,它被定義並初始化為0,然后判斷它是否小於10,如果小於10,那么執行
for后面花括號里的操作,如果不小於10,直接退出循環。我們的i目前等於0,所以,執行了操作,打印出了一個"Hello baby!",然后呢? 然后程序將跳轉回for后面的圓括號那行,但是,java將從右往左執行,就是說,先執行 i ++,這個是i自加1的意思,於是,我們的i變成了1,然后判斷,i < 10是否為真?為真,因為i現在等於1,既然為真,那就繼續跳轉進花括號進行操作,於是又打印出一條"Hello baby",然后再跳轉到圓括號那里,i ++,i變成2,然后再打印出信息,知道i等於9之后,i++,這次變成了10,i < 10這次為false了,將不再進入花括號執行操作,而是跳出循環,我們這個程序,只有一個for循環,跳出此循環,程序就結束了。
這個例子也許沒什么實際的意義,那么我們這里來看看有點兒實際意義的。 著名的數學家高斯,在10歲那年,用較短的時間,輕松的算出了1+2+3+...+100 = 5050, 使得他的老師彪特奈爾異常激動,意識到自己發現了一個天才。我們現在知道,當年高斯的算法是第一個數加上最后一個數是101,第二個數加上倒數第二個也是101,一共有50對這樣的加法,最后得到5050,那么如果我們用java的for循環來做呢? 我們在此用兩種方法,一種是1+2+...+100,另一種就是模擬高斯的做法,程序代碼如下:
你看,結果是相同的是吧,哎,如果當年有java,那輪得到高斯在那兒裝啊? 就算用笨辦法也比他做的快啊。可惜啊,當懶惰的Patrick Naughton在1990年12月大聲抱怨C++的時候,距離高斯算出5050這個數字已經213年了。
以上便是普通的for循環,一般來說,for循環經常控制某些操作的執行次數,所以,多數情況下,會對整形數據進行初始化和自加操作。但這不是絕對的,for循環可以很靈活的,比如下面的例子:
這個例子打印出Thinking in JAVA,但是每次都少打一個字母,這有些像"我頓時凌亂了, 頓時凌亂了,時凌亂了,凌亂了,亂了,了”, 對吧,這個小程序用到了String的基本操作,我們還沒有涉及到。不過這沒關系,我只是說,普通for循環的格式是死板的,但是使用for循環的人是靈活的。
我們今天就說到這里吧,雖然我本來還想說說for each循環,但是那必然會涉及到數組的問題,而我們還沒有說到數組,所以for each循環我們留到后面再說吧。