1.語法
for循環(huán)的基本語法如下:
for(①.聲明并初始化循環(huán)變量;②.判斷循環(huán)條件;④.改變循環(huán)變量值){
//③.循環(huán)體
}
語法說明:
1.for循環(huán)最先執(zhí)行初始化步驟。在這里可以聲明一種類型,但可以初始化一個(gè)或多個(gè)循環(huán)控制變量,也可以是空語句;
2.判斷循環(huán)條件,檢測布爾表達(dá)式的值。如果為 true,循環(huán)體被執(zhí)行。如果為false,循環(huán)終止,開始執(zhí)行循環(huán)體后面的語句。且for循環(huán)的執(zhí)行次數(shù)在執(zhí)行前就已經(jīng)是確定的。
3.執(zhí)行一次循環(huán)后,就會(huì)更新一次循環(huán)控制變量的值;
4.再次檢測布爾表達(dá)式,循環(huán)執(zhí)行上面的過程。
2. 執(zhí)行流程
根據(jù)上面的for循環(huán)語法,壹哥把for循環(huán)的執(zhí)行流程給大家做個(gè)詳細(xì)的解釋:
1.首先我們要在第①步聲明并初始化一個(gè)變量,該操作在循環(huán)中只會(huì)執(zhí)行一次;
2.每次循環(huán)之前,在第②步判斷循環(huán)條件是否成立,只有當(dāng)條件為true才會(huì)執(zhí)行,如果條件為false則結(jié)束循環(huán);
3.每次循環(huán)時(shí),都會(huì)在③中執(zhí)行循環(huán)體內(nèi)的代碼;
4.每次循環(huán)結(jié)束后,會(huì)自動(dòng)執(zhí)行第④部分,改變變量的初始值;
5.for循環(huán)中①、②、④部分都可以省略不寫,但必須存在兩個(gè)”分號(hào);“,也可以只寫一部分;
6.我們聲明變量類型時(shí),不一定非得是int,最后改變初始值也不一定非得是++;
7.for循環(huán)中支持嵌套循環(huán)。
根據(jù)上面的步驟,壹哥把重點(diǎn)步驟給大家總結(jié)如下:
①-->②-->③-->④-->②-->③-->④-->②-->③-->④-.....-②
如下圖所示:
2.for循環(huán)的幾種寫法
2.1 基本for循環(huán)
基本for循環(huán)包括三個(gè)部分:循環(huán)變量初始化、循環(huán)條件判斷和循環(huán)變量更新。通常的形式如下:
for (int i = 0; i < n; i++) {
// 循環(huán)體
}
其中,i 是循環(huán)變量,n 是循環(huán)次數(shù),循環(huán)體是需要重復(fù)執(zhí)行的代碼。
2.2 foreach循環(huán)
foreach循環(huán)通常用于遍歷數(shù)組或集合中的元素。它的語法形式為:
for (類型 變量名 : 數(shù)組名) {
// 循環(huán)體
}
其中,類型 是數(shù)組或集合中元素的數(shù)據(jù)類型,變量名 是循環(huán)變量的名稱,數(shù)組名 是需要遍歷的數(shù)組或集合的名稱。循環(huán)體是需要重復(fù)執(zhí)行的代碼。
例如,遍歷一個(gè)整型數(shù)組的方式如下:
int[] nums = {1, 2, 3, 4, 5};
for (int num : nums) {
System.out.println(num);
}
2.3 while循環(huán)
while循環(huán)會(huì)在滿足循環(huán)條件時(shí)重復(fù)執(zhí)行代碼塊。它的語法形式為:
while (循環(huán)條件) {
// 循環(huán)體
}
其中,循環(huán)條件 是需要滿足的條件,循環(huán)體是需要重復(fù)執(zhí)行的代碼。
例如,一個(gè)簡單的while循環(huán)如下所示:
int i = 0;
while (i < 10) {
System.out.println(i);
i++;
}
這個(gè)while循環(huán)會(huì)不斷地打印變量i的值,直到i的值達(dá)到10為止。
2.4 do-while循環(huán)
do-while循環(huán)與while循環(huán)類似,但它會(huì)先執(zhí)行一次循環(huán)體,然后再檢查循環(huán)條件。它的語法形式為:
do {
// 循環(huán)體
} while (循環(huán)條件);
其中,循環(huán)體 是需要重復(fù)執(zhí)行的代碼,循環(huán)條件 是需要滿足的條件。
例如,一個(gè)簡單的do-while循環(huán)如下所示:
int i = 0;
do {
System.out.println(i);
i++;
} while (i < 10);
這個(gè)do-while循環(huán)會(huì)先打印變量i的值為0,然后將i的值加1,并檢查i是否小于10,如果滿足則再次執(zhí)行循環(huán)體。這個(gè)循環(huán)會(huì)執(zhí)行10次,因?yàn)樵诘?0次執(zhí)行時(shí),i的值為9,不再小于10。
2.5 簡寫形式
在for循行中,第①/②/④這幾部分的內(nèi)容都是可以省略簡寫的。
public class Demo02 {
public static void main(String[] args) {
//簡寫形式1:在第一部分中簡寫變量的聲明
//int i = 0;
//for (; i < 100; i++) {
// System.out.println("小白學(xué)java,i=" + i);
//}
//簡寫形式2:在第①和④中簡寫
//int i = 0;
//for ( ; i < 100; ) {
// i++;
// System.out.println("小白學(xué)java,i=" + i);
//}
//簡寫形式3,①/②/④都簡寫--->死循環(huán)
int i = 0;
for (;;) {
i++;
System.out.println("小白學(xué)java,i=" + i);
}
}
}
我們一定要注意,如果是第三種簡寫形式,把①/②/④都簡寫了,就會(huì)成為死循環(huán),本段程序會(huì)一直不停地打印下去。此時(shí)我們可以點(diǎn)擊控制臺(tái)的”紅色“按鈕停止程序的運(yùn)行
3.for循環(huán)語句的用法
需求:循環(huán)輸出100遍 ”小白學(xué)java“
public class ForDemo {
public static void main(String[] args) {
//for循環(huán),這里的i就是一個(gè)局部變量
for( int i=0; i<100; i++) {
System.out.println("小白學(xué)java,i="+i);
}
}
}
注意,上面for循環(huán)中定義的變量i就是一個(gè)局部變量哦!
需求:計(jì)算1-100的和,1+2+3+4+5+...+100
public class ForDemo02 {
public static void main(String[] args) {
// 計(jì)算1-100的和,1+2+3+4+5+...+100
//定義一個(gè)用于存儲(chǔ)”和“的局部變量
int sum = 0;
for (int i = 1; i <= 100; i++) {
// i = 1;
// sum=0+1;
// i = 2;
// sum= 1+2;
sum = sum + i;
}
System.out.println("sum=" + sum);
}
}
需求:打印出一個(gè)三角形,用“*”來表示。
public class ForDemo03 {
public static void main(String[] args) {
// for循環(huán)嵌套--打印出一個(gè)三角形,用“*”來表示
for (int i = 1; i <= 5; i++) {
//定義第2個(gè)局部變量j,j設(shè)置為<=i
for (int j = 1; j <= i; j++) {
//這里千萬不要換行哦
System.out.print(" * ");
}
//這里一定要換行哦
System.out.println();
}
}
}
需求:使用for循環(huán)產(chǎn)生20個(gè)1-100的隨機(jī)數(shù),且這20個(gè)數(shù)互不相同:
import java.util.Random;
public class ForDemo03 {
public static void main(String[] args) {
int[] randomNumbers = new int[20];
Random random = new Random();
for (int i = 0; i < randomNumbers.length; i++) {
int newNumber;
boolean numberExists;
do {
newNumber = random.nextInt(100) + 1;
numberExists = false;
for (int j = 0; j < i; j++) {
if (randomNumbers[j] == newNumber) {
numberExists = true;
break;
}
}
} while (numberExists);
randomNumbers[i] = newNumber;
System.out.println(randomNumbers[i]);
}
}
}
注意:在上面的代碼中,我們使用了一個(gè)do-while循環(huán),每次生成一個(gè)新的隨機(jī)數(shù)并檢查它是否已經(jīng)存在于數(shù)組中。如果已經(jīng)存在,則繼續(xù)生成新的隨機(jī)數(shù),直到找到一個(gè)不存在于數(shù)組中的隨機(jī)數(shù)。然后將該隨機(jī)數(shù)存儲(chǔ)在數(shù)組中,并輸出到控制臺(tái)。
需求:打印出九九乘法表。
public class Demo02 {
public static void main(String[] args) {
// for循環(huán)嵌套--打印出一個(gè)三角形,用“*”來表示
for (int i = 1; i <= 5; i++) {
//定義第2個(gè)局部變量j,j設(shè)置為<=i
for (int j = 1; j <= i; j++) {
//這里千萬不要換行哦
System.out.print(" * ");
}
//這里一定要換行哦
System.out.println();
}
}
}
經(jīng)常有朋友問:java循環(huán)長度的相同、循環(huán)體代碼相同的兩次for循環(huán)的執(zhí)行時(shí)間相差了100倍這是為什么?
在這里給大家總結(jié)幾種情況:大家可以學(xué)習(xí)參考下:
1.編譯器優(yōu)化:Java編譯器在編譯代碼時(shí)會(huì)進(jìn)行一些優(yōu)化,例如將代碼重構(gòu)為更高效的形式,消除無用代碼等等。這些優(yōu)化可能會(huì)使一個(gè)循環(huán)比另一個(gè)循環(huán)更快速地執(zhí)行。
2.緩存:在循環(huán)執(zhí)行期間,CPU會(huì)從內(nèi)存中讀取數(shù)據(jù)并將其緩存在緩存中。如果兩個(gè)循環(huán)訪問的數(shù)據(jù)不同,或者訪問數(shù)據(jù)的方式不同,緩存效率可能會(huì)受到影響,從而導(dǎo)致執(zhí)行時(shí)間的差異。
3.硬件差異:執(zhí)行時(shí)間的差異也可能是由于硬件差異引起的,例如不同的CPU或內(nèi)存速度。
4.其他因素:還有一些其他因素可能導(dǎo)致執(zhí)行時(shí)間的差異,例如操作系統(tǒng)負(fù)載、線程競爭等等。
要確定造成執(zhí)行時(shí)間差異的具體原因,可以使用性能分析工具來分析代碼的執(zhí)行情況,例如VisualVM或Eclipse Memory Analyzer。這些工具可以幫助您確定循環(huán)中的瓶頸,并提供優(yōu)化建議,以改善代碼的性能。