Math.random(): [0.0, 1.0): 左閉右開
公式:[a, b]: (int)(Math.random() * (b - a + 1) + a)
1、if...else...
-
else:就近匹配原則。
針對條件表達(dá)式:
- 如果多個條件表達(dá)式之間是“互斥”關(guān)系(或沒有交集的關(guān)系),哪個判斷和執(zhí)行語句聲明在上面還是下面,無所謂。
- 如果多個條件表達(dá)式之間有交集的關(guān)系,需要根據(jù)實際情況,考慮清楚應(yīng)該將哪個結(jié)構(gòu)聲明在上面。
- 如果多個條件表達(dá)式之間有包含關(guān)系,通常情況下,需要將范圍小的聲明在范圍大的上面。否則,范圍小的就沒機會執(zhí)行了。
2、switch-case
-
switch結(jié)構(gòu)中的表達(dá)式,只能是如下的6種數(shù)據(jù)類型之一:byte、short、char、int、枚舉(JDK5.0新增)、String(JDK7.0新增)。 -
case之后只能聲明常量,不能聲明范圍。 -
default相當(dāng)于if-else結(jié)構(gòu)中的else。default結(jié)構(gòu)是可選的,而且位置是靈活的。
說明:我們寫分支結(jié)構(gòu)時,當(dāng)發(fā)現(xiàn)既可以使用
switch-case(同時,switch中表達(dá)式的取值情況不太多),又可以使用if-else時,我們優(yōu)先選擇使用switch-case。
原因:switch-case執(zhí)行效率稍高。
3、循環(huán)結(jié)構(gòu)的4個要素
① 初始化條件
② 循環(huán)條件 ---> 是boolean類型
③ 循環(huán)體
④ 迭代條件
4、for循環(huán)
-
break:跳出循環(huán)。
for (int i = 0; i <= 5; i++) {
System.out.prntln("Hello World!");
}
// i: 在for循環(huán)內(nèi)有效,出了for循環(huán)就失效了。
System.out.prntln(i);
5、while循環(huán)
- 說明:寫
while循環(huán)千萬小心不要丟了迭代條件。一旦丟了,就可能導(dǎo)致死循環(huán)! -
for循環(huán)和while循環(huán)是可以相互轉(zhuǎn)換的。
示例:遍歷100以內(nèi)的偶數(shù)
int i = 1;
while(i <= 100){
if (i % 2 === 0) {
System.out.println(i);
}
// 迭代條件
i++;
}
6、do-while
- 說明:
do-while循環(huán)至少會執(zhí)行一次循環(huán)體!
示例:遍歷100以內(nèi)的偶數(shù)
int num = 1;
do {
if (num % 2 === 0) {
System.out.println(num);
}
// 迭代條件
i++;
} while(num <= 100);
7、無限循環(huán)
最簡單的“無限”循環(huán)格式:while(true),for(;;),無限循環(huán)存在的原因是并不知道循環(huán)多少次,需要根據(jù)循環(huán)體內(nèi)部某些條件,來控制循環(huán)的結(jié)束。
題目:
從鍵盤讀入個數(shù)不確定的整數(shù),并判斷讀入的正數(shù)和負(fù)數(shù)的個數(shù),輸入為0時結(jié)束程序。
import java.util.Scanner;
class ForWhileTest {
public static void main(String args[]) {
Scanner scan = new Scanner(System.in);
int positiveNumber = 0; // 記錄正數(shù)的個數(shù)
int negativeNumber = 0; // 記錄負(fù)數(shù)的個數(shù)
while (true) {
int number = scan.nextInt();
if (number > 0) {
positiveNumber++;
} else if (number < 0) {
negativeNumber++;
} else {
// 一旦執(zhí)行break,跳出循環(huán)
break;
}
}
}
}
8、嵌套循環(huán)
示例:100以內(nèi)的所有質(zhì)數(shù)。(素數(shù),只能被1和它本身整除的自然數(shù)。)
// 獲取當(dāng)前時間距離1970-01-01 00:00:00 的毫秒數(shù)
long start = System.currentTimeMillis();
boolean isFlag = true; // 標(biāo)識i是否被j除盡,一旦除盡,修改其值為false。
for(int i = 2; i <= 100; i++) {
// 優(yōu)化二:j < i 改成 j <= Math.sqrt(i),對本身是質(zhì)數(shù)的自然數(shù)是有效的。
for (int j = 2; j <= Math.sqrt(i); j++) {
if (i % j === 0) { // i被j除盡
isFlag = false;
break; // 優(yōu)化一:只對本身非質(zhì)數(shù)的自然數(shù)是有效的。
}
}
if (isFlag === true) {
System.out.println(i);
}
// 重置isFlag
isFlag = true;
}
// 獲取當(dāng)前時間距離1970-01-01 00:00:00 的毫秒數(shù)
long end= System.currentTimeMillis();
System.out.pringln("所花費的時間為:" + (end - start));
9、break和continue關(guān)鍵字的使用
不同點:
-
break:在循環(huán)中使用時,作用是結(jié)束當(dāng)前循環(huán)。 -
continue:在循環(huán)中使用時,作用是結(jié)束當(dāng)次循環(huán)。
相同點:
關(guān)鍵字后面不能聲明執(zhí)行語句。
-
break默認(rèn)跳出包裹此關(guān)鍵字最近的一層循環(huán)。 - 帶標(biāo)簽的
break
label: for (int i = 1; i <= 4; i++) {
for (int j = 1; j <= 10; j++) {
if (j % 4 === 0) {
break label; // 結(jié)束指定標(biāo)識的一層循環(huán)結(jié)構(gòu)
}
}
}
- 帶標(biāo)簽的
continue
label: for (int i = 1; i <= 4; i++) {
for (int j = 1; j <= 10; j++) {
if (j % 4 === 0) {
continue label; // 結(jié)束指定標(biāo)識的一層循環(huán)結(jié)構(gòu)的當(dāng)次循環(huán)
}
}
}
示例:100以內(nèi)的所有質(zhì)數(shù)。(素數(shù),只能被1和它本身整除的自然數(shù)。)
int count = 0; // 統(tǒng)計質(zhì)數(shù)的個數(shù)
// 獲取當(dāng)前時間距離1970-01-01 00:00:00 的毫秒數(shù)
long start = System.currentTimeMillis();
label: for(int i = 2; i <= 100; i++) {
// 優(yōu)化二:j < i 改成 j <= Math.sqrt(i),對本身是質(zhì)數(shù)的自然數(shù)是有效的。
for (int j = 2; j <= Math.sqrt(i); j++) {
if (i % j === 0) { // i被j除盡
continue label;
}
}
// 能執(zhí)行到此步驟的,都是質(zhì)數(shù)
count++;
}
// 獲取當(dāng)前時間距離1970-01-01 00:00:00 的毫秒數(shù)
long end= System.currentTimeMillis();
System.out.pringln("所花費的時間為:" + (end - start));
10、return的使用
-
return:并非專門用于結(jié)束循環(huán)的,它的功能是結(jié)束一個方法。當(dāng)一個方法執(zhí)行到一個return語句時,這個方法將被結(jié)束。 - 與
break和continue不同的是,return直接結(jié)束整個方法,不管這個return處于多少層循環(huán)之內(nèi)。