Java運(yùn)算符與流程控制之全類型運(yùn)算符用法及分支?/?循環(huán)語句實(shí)戰(zhàn)指南
前言
Java 運(yùn)算符是實(shí)現(xiàn)數(shù)據(jù)運(yùn)算、邏輯判斷的核心工具,流程控制則是掌控程序執(zhí)行順序的關(guān)鍵,兩者共同構(gòu)成了 Java 程序的執(zhí)行邏輯基礎(chǔ)。本文將系統(tǒng)拆解 Java 全類型運(yùn)算符的用法、優(yōu)先級,以及分支、循環(huán)語句的實(shí)戰(zhàn)場景,結(jié)合大量代碼示例,幫助讀者熟練掌握程序邏輯的構(gòu)建方式。
一、Java 運(yùn)算符全解析
運(yùn)算符是用于對數(shù)據(jù)進(jìn)行運(yùn)算或邏輯判斷的符號,Java 中的運(yùn)算符按功能可分為算術(shù)運(yùn)算符、關(guān)系運(yùn)算符、邏輯運(yùn)算符、賦值運(yùn)算符、三元運(yùn)算符等,每種運(yùn)算符都有明確的語法規(guī)則和使用場景。
1.1 算術(shù)運(yùn)算符:實(shí)現(xiàn)數(shù)值運(yùn)算
算術(shù)運(yùn)算符用于對數(shù)值類型數(shù)據(jù)進(jìn)行加減乘除等運(yùn)算,分為基本算術(shù)運(yùn)算符和擴(kuò)展算術(shù)運(yùn)算符兩類。
(1)基本算術(shù)運(yùn)算符
包含+(加)、-(減)、*(乘)、/(除)、%(取模 / 取余),是最基礎(chǔ)的數(shù)值運(yùn)算工具。
public class ArithmeticBasicDemo {
public static void main(String[] args) {
int a = 10;
int b = 3;
// 加法運(yùn)算
int addResult = a + b;
System.out.println("a + b = " + addResult); // 輸出13
// 減法運(yùn)算
int subResult = a - b;
System.out.println("a - b = " + subResult); // 輸出7
// 乘法運(yùn)算
int mulResult = a * b;
System.out.println("a * b = " + mulResult); // 輸出30
// 除法運(yùn)算:整數(shù)相除結(jié)果為整數(shù),舍棄小數(shù)部分
int divResult1 = a / b;
System.out.println("a / b(整數(shù)相除) = " + divResult1); // 輸出3
// 除法運(yùn)算:浮點(diǎn)數(shù)相除結(jié)果為浮點(diǎn)數(shù)
double divResult2 = (double) a / b;
System.out.println("a / b(浮點(diǎn)數(shù)相除) = " + divResult2); // 輸出3.3333333333333335
// 取模運(yùn)算:返回除法的余數(shù),符號與被除數(shù)一致
int modResult1 = a % b;
System.out.println("a % b = " + modResult1); // 輸出1
int modResult2 = -10 % 3;
System.out.println("-10 % 3 = " + modResult2); // 輸出-1
int modResult3 = 10 % -3;
System.out.println("10 % -3 = " + modResult3); // 輸出1
}
}
注意事項(xiàng):
- 整數(shù)相除時,結(jié)果會自動舍棄小數(shù)部分,如需保留小數(shù),需將其中一個操作數(shù)轉(zhuǎn)為浮點(diǎn)類型。
- 取模運(yùn)算的結(jié)果符號與被除數(shù)一致,常用于判斷奇偶性(
num % 2 == 0表示偶數(shù))、循環(huán)取余等場景。 - 除數(shù)不能為 0,否則會拋出
ArithmeticException異常。
(2)擴(kuò)展算術(shù)運(yùn)算符
包含++(自增)、--(自減),用于實(shí)現(xiàn)變量值的自增 1 或自減 1,分為前置運(yùn)算和后置運(yùn)算兩種形式。
public class ArithmeticExtendDemo {
public static void main(String[] args) {
int x = 5;
int y = 5;
// 前置自增:先自增1,再參與其他運(yùn)算
int preIncrement = ++x;
System.out.println("前置自增后x = " + x); // 輸出6
System.out.println("前置自增結(jié)果 = " + preIncrement); // 輸出6
// 后置自增:先參與其他運(yùn)算,再自增1
int postIncrement = y++;
System.out.println("后置自增后y = " + y); // 輸出6
System.out.println("后置自增結(jié)果 = " + postIncrement); // 輸出5
int m = 3;
int n = 3;
// 前置自減:先自減1,再參與其他運(yùn)算
int preDecrement = --m;
System.out.println("前置自減后m = " + m); // 輸出2
System.out.println("前置自減結(jié)果 = " + preDecrement); // 輸出2
// 后置自減:先參與其他運(yùn)算,再自減1
int postDecrement = n--;
System.out.println("后置自減后n = " + n); // 輸出2
System.out.println("后置自減結(jié)果 = " + postDecrement); // 輸出3
}
}
注意事項(xiàng):
- 自增 / 自減運(yùn)算符只能作用于變量,不能作用于常量(如
5++會編譯報錯)。 - 在復(fù)雜表達(dá)式中,需注意前置和后置運(yùn)算的區(qū)別,避免邏輯錯誤。
1.2 關(guān)系運(yùn)算符:實(shí)現(xiàn)條件判斷
關(guān)系運(yùn)算符用于判斷兩個數(shù)據(jù)之間的大小、相等關(guān)系,返回值為boolean類型(true或false),常用于分支語句和循環(huán)語句的條件判斷。
Java 中的關(guān)系運(yùn)算符包括:>(大于)、<(小于)、>=(大于等于)、<=(小于等于)、==(等于)、!=(不等于)。
public class RelationalOperatorDemo {
public static void main(String[] args) {
int a = 10;
int b = 20;
String s1 = "Java";
String s2 = "Java";
String s3 = new String("Java");
// 數(shù)值類型的關(guān)系判斷
System.out.println("a > b : " + (a > b)); // 輸出false
System.out.println("a < b : " + (a < b)); // 輸出true
System.out.println("a >= 10 : " + (a >= 10)); // 輸出true
System.out.println("b <= 19 : " + (b <= 19)); // 輸出false
System.out.println("a == 10 : " + (a == 10)); // 輸出true
System.out.println("a != b : " + (a != b)); // 輸出true
// 引用類型的關(guān)系判斷:== 比較的是對象地址,equals() 比較的是內(nèi)容
System.out.println("s1 == s2 : " + (s1 == s2)); // 輸出true(字符串常量池,地址相同)
System.out.println("s1 == s3 : " + (s1 == s3)); // 輸出false(堆內(nèi)存中不同對象,地址不同)
System.out.println("s1.equals(s3) : " + s1.equals(s3)); // 輸出true(內(nèi)容相同)
}
}
注意事項(xiàng):
- 關(guān)系運(yùn)算符的結(jié)果必須是
boolean類型,不能直接用于賦值(如int c = a > b;會編譯報錯)。 - 對于引用數(shù)據(jù)類型,
==比較的是對象的內(nèi)存地址,equals()方法(默認(rèn)也是比較地址,String 類重寫后比較內(nèi)容)用于比較對象的內(nèi)容。 - 避免將浮點(diǎn)數(shù)用
==比較是否相等,由于精度丟失問題,建議通過判斷兩者差值的絕對值是否小于某個極小值(如1e-6)來判斷。
1.3 邏輯運(yùn)算符:實(shí)現(xiàn)復(fù)雜條件判斷
邏輯運(yùn)算符用于對多個boolean類型的值進(jìn)行邏輯運(yùn)算,返回值仍為boolean類型,常用于組合多個關(guān)系判斷條件。
Java 中的邏輯運(yùn)算符包括:&&(短路與)、||(短路或)、!(非)、&(邏輯與)、|(邏輯或)。
(1)短路邏輯運(yùn)算符(常用)
&&(短路與):只有所有條件都為true時,結(jié)果才為true;如果第一個條件為false,則直接返回false,不再判斷后續(xù)條件(短路特性)。||(短路或):只要有一個條件為true,結(jié)果就為true;如果第一個條件為true,則直接返回true,不再判斷后續(xù)條件(短路特性)。
(2)非短路邏輯運(yùn)算符
&(邏輯與):無論第一個條件是否為false,都會判斷所有條件,最終返回所有條件的與結(jié)果。|(邏輯或):無論第一個條件是否為true,都會判斷所有條件,最終返回所有條件的或結(jié)果。
(3)邏輯非運(yùn)算符
!(非):對boolean值取反,!true返回false,!false返回true。
public class LogicalOperatorDemo {
public static void main(String[] args) {
int num = 15;
// 短路與:num > 10 為true,繼續(xù)判斷num < 20,最終為true
boolean shortAnd = (num > 10) && (num < 20);
System.out.println("短路與結(jié)果:" + shortAnd); // 輸出true
// 短路與:num < 10 為false,直接返回false,不執(zhí)行num++
int temp1 = num;
boolean shortAnd2 = (temp1 < 10) && (temp1++ > 0);
System.out.println("短路與2結(jié)果:" + shortAnd2); // 輸出false
System.out.println("temp1的值:" + temp1); // 輸出15(temp1++未執(zhí)行)
// 邏輯與:temp1 < 10 為false,仍會執(zhí)行temp1++
int temp2 = num;
boolean logicAnd = (temp2 < 10) & (temp2++ > 0);
System.out.println("邏輯與結(jié)果:" + logicAnd); // 輸出false
System.out.println("temp2的值:" + temp2); // 輸出16(temp2++已執(zhí)行)
// 短路或:num > 10 為true,直接返回true,不執(zhí)行num--
int temp3 = num;
boolean shortOr = (temp3 > 10) || (temp3-- < 0);
System.out.println("短路或結(jié)果:" + shortOr); // 輸出true
System.out.println("temp3的值:" + temp3); // 輸出15(temp3--未執(zhí)行)
// 邏輯或:num > 10 為true,仍會執(zhí)行num--
int temp4 = num;
boolean logicOr = (temp4 > 10) | (temp4-- < 0);
System.out.println("邏輯或結(jié)果:" + logicOr); // 輸出true
System.out.println("temp4的值:" + temp4); // 輸出14(temp4--已執(zhí)行)
// 邏輯非
boolean flag = true;
boolean notFlag = !flag;
System.out.println("!true = " + notFlag); // 輸出false
System.out.println("!false = " + !notFlag); // 輸出true
// 復(fù)雜邏輯組合
boolean complexCondition = (num > 0) && (num % 2 == 1) || (num == 0);
System.out.println("復(fù)雜條件結(jié)果:" + complexCondition); // 輸出true(15>0且是奇數(shù))
}
}
注意事項(xiàng):
- 短路邏輯運(yùn)算符(
&&、||)由于具有短路特性,能提高程序執(zhí)行效率,實(shí)際開發(fā)中優(yōu)先使用。 - 邏輯運(yùn)算符的操作數(shù)必須是
boolean類型,不能是其他類型(如1 && 2會編譯報錯)。
1.4 賦值運(yùn)算符:實(shí)現(xiàn)變量賦值
賦值運(yùn)算符用于將右側(cè)的值賦值給左側(cè)的變量,分為基本賦值運(yùn)算符和復(fù)合賦值運(yùn)算符兩類。
(1)基本賦值運(yùn)算符
=(賦值):將右側(cè)的值(或表達(dá)式結(jié)果)賦值給左側(cè)的變量,左側(cè)必須是變量,不能是常量或表達(dá)式。
int a = 10; // 基本賦值 String name = "Java語法"; // 基本賦值 a = a + 5; // 將a+5的結(jié)果賦值給a
(2)復(fù)合賦值運(yùn)算符
復(fù)合賦值運(yùn)算符是賦值運(yùn)算符與算術(shù)運(yùn)算符的結(jié)合,用于簡化代碼,包括+=、-=、*=、/=、%=等。
語法格式:變量 復(fù)合賦值運(yùn)算符 表達(dá)式,等價于變量 = 變量 算術(shù)運(yùn)算符 表達(dá)式。
public class AssignmentOperatorDemo {
public static void main(String[] args) {
int a = 10;
// += 等價于 a = a + 5
a += 5;
System.out.println("a += 5 后:" + a); // 輸出15
// -= 等價于 a = a - 3
a -= 3;
System.out.println("a -= 3 后:" + a); // 輸出12
// *= 等價于 a = a * 2
a *= 2;
System.out.println("a *= 2 后:" + a); // 輸出24
// /= 等價于 a = a / 4
a /= 4;
System.out.println("a /= 4 后:" + a); // 輸出6
// %= 等價于 a = a % 4
a %= 4;
System.out.println("a %= 4 后:" + a); // 輸出2
// 復(fù)合賦值運(yùn)算符會自動進(jìn)行類型轉(zhuǎn)換
byte b = 5;
b += 3; // 等價于 b = (byte)(b + 3),自動強(qiáng)制類型轉(zhuǎn)換
System.out.println("byte類型b += 3 后:" + b); // 輸出8
// 以下代碼編譯報錯:直接賦值不會自動類型轉(zhuǎn)換
// byte c = 5;
// c = c + 3; // 錯誤:int類型無法賦值給byte類型
}
}
注意事項(xiàng):
- 復(fù)合賦值運(yùn)算符會自動進(jìn)行強(qiáng)制類型轉(zhuǎn)換,而直接使用算術(shù)運(yùn)算符 + 賦值的形式不會,這是兩者的核心區(qū)別。
- 賦值運(yùn)算符的優(yōu)先級較低,會先執(zhí)行右側(cè)的表達(dá)式,再將結(jié)果賦值給左側(cè)變量。
1.5 三元運(yùn)算符:簡化分支判斷
三元運(yùn)算符(又稱三目運(yùn)算符)是 Java 中唯一的三目運(yùn)算符,用于簡化簡單的if-else分支判斷,返回一個具體的值。
語法格式:條件表達(dá)式 ? 表達(dá)式1 : 表達(dá)式2
- 執(zhí)行邏輯:如果條件表達(dá)式為
true,則執(zhí)行表達(dá)式 1 并返回其結(jié)果;如果為false,則執(zhí)行表達(dá)式 2 并返回其結(jié)果。 - 要求:表達(dá)式 1 和表達(dá)式 2 的類型必須一致(或可以自動類型轉(zhuǎn)換)。
public class TernaryOperatorDemo {
public static void main(String[] args) {
int score = 85;
int num1 = 20;
int num2 = 30;
// 判斷成績等級
String grade = score >= 90 ? "優(yōu)秀" : (score >= 80 ? "良好" : (score >= 60 ? "及格" : "不及格"));
System.out.println("成績等級:" + grade); // 輸出良好
// 獲取兩個數(shù)的最大值
int maxNum = num1 > num2 ? num1 : num2;
System.out.println("最大值:" + maxNum); // 輸出30
// 獲取三個數(shù)的最小值
int num3 = 15;
int minNum = (num1 < num2 ? num1 : num2) < num3 ? (num1 < num2 ? num1 : num2) : num3;
System.out.println("最小值:" + minNum); // 輸出15
// 自動類型轉(zhuǎn)換:表達(dá)式1和表達(dá)式2類型不同,自動轉(zhuǎn)為范圍更大的類型
double result = num1 > 25 ? 10 : 3.14;
System.out.println("自動類型轉(zhuǎn)換結(jié)果:" + result); // 輸出3.14
}
}
注意事項(xiàng):
- 三元運(yùn)算符適用于簡單的二分支判斷,復(fù)雜的多分支判斷建議使用
if-else或switch語句,避免代碼可讀性降低。 - 三元運(yùn)算符的結(jié)果必須被使用(如賦值給變量、作為參數(shù)傳遞),不能單獨(dú)作為一條語句(如
score >= 60 ? "及格" : "不及格";會編譯報錯)。
1.6 運(yùn)算符的優(yōu)先級與結(jié)合性
當(dāng)一個表達(dá)式中包含多個運(yùn)算符時,會按照 “優(yōu)先級從高到低” 的順序執(zhí)行;當(dāng)優(yōu)先級相同時,會按照 “結(jié)合性”(從左到右或從右到左)執(zhí)行。
(1)優(yōu)先級排序(從高到低,核心常用)
- 括號
() - 自增 / 自減
++、-- - 算術(shù)運(yùn)算符
*、/、%>+、- - 關(guān)系運(yùn)算符
>、<、>=、<=>==、!= - 邏輯運(yùn)算符
&&>|| - 三元運(yùn)算符
? : - 賦值運(yùn)算符
=、+=、-=等
(2)結(jié)合性
- 大部分運(yùn)算符的結(jié)合性是 “從左到右”(如算術(shù)運(yùn)算符、關(guān)系運(yùn)算符)。
- 賦值運(yùn)算符、三元運(yùn)算符的結(jié)合性是 “從右到左”(如
a = b = c;等價于a = (b = c);)。
public class OperatorPriorityDemo {
public static void main(String[] args) {
int a = 2;
int b = 3;
int c = 4;
// 優(yōu)先級:括號 > 乘除 > 加減
int result1 = a + b * c;
System.out.println("a + b * c = " + result1); // 輸出14(先算3*4=12,再算2+12=14)
int result2 = (a + b) * c;
System.out.println("(a + b) * c = " + result2); // 輸出20(先算2+3=5,再算5*4=20)
// 優(yōu)先級:自增 > 算術(shù)運(yùn)算 > 關(guān)系運(yùn)算 > 邏輯運(yùn)算
int x = 5;
boolean result3 = x++ > 5 && x < 8;
System.out.println("x++ > 5 && x < 8 = " + result3); // 輸出false(x++=5,5>5為false,短路與直接返回false)
System.out.println("x的值:" + x); // 輸出6
// 結(jié)合性:賦值運(yùn)算符從右到左
int m = 1;
int n = 2;
int p = 3;
m = n = p; // 等價于m = (n = p)
System.out.println("m = " + m + ", n = " + n + ", p = " + p); // 輸出m=3, n=3, p=3
// 結(jié)合性:算術(shù)運(yùn)算符從左到右
int result4 = a + b + c;
System.out.println("a + b + c = " + result4); // 輸出9(先算2+3=5,再算5+4=9)
}
}
注意事項(xiàng):
- 實(shí)際開發(fā)中,無需死記硬背運(yùn)算符優(yōu)先級,通過添加括號
()可以明確執(zhí)行順序,提高代碼可讀性。
1.7 強(qiáng)制類型轉(zhuǎn)換的常見場景與問題
在數(shù)據(jù)類型轉(zhuǎn)換中,強(qiáng)制類型轉(zhuǎn)換是將大范圍類型轉(zhuǎn)為小范圍類型的手動操作,容易出現(xiàn)數(shù)據(jù)溢出或精度丟失問題,以下是典型示例:
public class ForceTypeConvertDemo {
public static void main(String[] args) {
// int → byte(強(qiáng)制轉(zhuǎn)換,可能溢出)
int a = 200;
byte b = (byte) a;
System.out.println(b); // 輸出-56(200超出byte的取值范圍,發(fā)生溢出)
// double → int(強(qiáng)制轉(zhuǎn)換,精度丟失)
double d = 3.99;
int num = (int) d;
System.out.println(num); // 輸出3(小數(shù)部分被舍棄,不是四舍五入)
// long → int(強(qiáng)制轉(zhuǎn)換,可能溢出)
long l = 10000000000L;
int i = (int) l;
System.out.println(i); // 輸出1410065408(超出int范圍,溢出)
// 補(bǔ)充:浮點(diǎn)型轉(zhuǎn)浮點(diǎn)型(精度丟失)
double bigDouble = 123456789.123456789;
float smallFloat = (float) bigDouble;
System.out.println(smallFloat); // 輸出1.23456792E8(精度丟失,有效數(shù)字不足)
}
}
強(qiáng)制類型轉(zhuǎn)換注意事項(xiàng):
- 溢出原因:小范圍類型的取值范圍無法容納大范圍類型的值,導(dǎo)致數(shù)據(jù)按二進(jìn)制補(bǔ)碼循環(huán)存儲(如 byte 的取值范圍是 - 128~127,200 的二進(jìn)制補(bǔ)碼超出 1 字節(jié),截斷后得到 - 56)。
- 精度丟失:浮點(diǎn)型轉(zhuǎn)整型時直接舍棄小數(shù)部分,浮點(diǎn)型之間轉(zhuǎn)換時因有效數(shù)字不足導(dǎo)致精度下降,如需四舍五入,可使用
Math.round()方法(如Math.round(3.99)返回 4)。 - 安全轉(zhuǎn)換:強(qiáng)制轉(zhuǎn)換前應(yīng)先判斷值是否在目標(biāo)類型的取值范圍內(nèi),避免溢出(如
if (a >= Byte.MIN_VALUE && a <= Byte.MAX_VALUE) { byte b = (byte) a; })。
二、Java 流程控制:掌控程序執(zhí)行順序
流程控制用于決定程序的執(zhí)行路徑,分為分支結(jié)構(gòu)(選擇結(jié)構(gòu))和循環(huán)結(jié)構(gòu)兩類,分支結(jié)構(gòu)根據(jù)條件判斷執(zhí)行不同代碼塊,循環(huán)結(jié)構(gòu)根據(jù)條件重復(fù)執(zhí)行某段代碼。
2.1 分支結(jié)構(gòu):if-else 語句
if-else語句是最常用的分支結(jié)構(gòu),根據(jù)條件的真假執(zhí)行不同的代碼塊,分為單分支、雙分支和多分支三種形式。
(1)單分支 if 語句
語法格式:
if (條件表達(dá)式) {
// 條件為true時執(zhí)行的代碼塊
}
執(zhí)行邏輯:條件表達(dá)式為true時,執(zhí)行大括號內(nèi)的代碼塊;為false時,跳過代碼塊,繼續(xù)執(zhí)行后續(xù)代碼。
public class IfSingleDemo {
public static void main(String[] args) {
int age = 18;
// 單分支判斷:是否成年
if (age >= 18) {
System.out.println("你已成年,具備完全民事行為能力。");
}
int score = 95;
if (score >= 90) {
System.out.println("恭喜你,成績達(dá)到優(yōu)秀等級!");
System.out.println("獲得獎學(xué)金獎勵。");
}
System.out.println("單分支判斷結(jié)束。");
}
}
注意事項(xiàng):如果代碼塊只有一條語句,大括號{}可以省略,但建議始終保留,提高代碼可讀性和可維護(hù)性。
(2)雙分支 if-else 語句
語法格式:
if (條件表達(dá)式) {
// 條件為true時執(zhí)行的代碼塊
} else {
// 條件為false時執(zhí)行的代碼塊
}
執(zhí)行邏輯:條件表達(dá)式為true時執(zhí)行 if 代碼塊,為false時執(zhí)行 else 代碼塊,兩者互斥,必有一個執(zhí)行。
public class IfElseDemo {
public static void main(String[] args) {
int num = -7;
// 雙分支判斷:正數(shù)/非正數(shù)
if (num > 0) {
System.out.println(num + " 是正數(shù)。");
} else {
System.out.println(num + " 是負(fù)數(shù)或零。");
}
String gender = "女";
if (gender.equals("男")) {
System.out.println("性別:男");
} else {
System.out.println("性別:女");
}
}
}
(3)多分支 if-else if-else 語句
語法格式:
if (條件表達(dá)式1) {
// 條件1為true時執(zhí)行的代碼塊
} else if (條件表達(dá)式2) {
// 條件1為false、條件2為true時執(zhí)行的代碼塊
} else if (條件表達(dá)式3) {
// 條件1、2為false、條件3為true時執(zhí)行的代碼塊
} else {
// 所有條件都為false時執(zhí)行的代碼塊
}
執(zhí)行邏輯:從上到下依次判斷條件表達(dá)式,只要有一個條件為true,就執(zhí)行對應(yīng)的代碼塊,后續(xù)條件不再判斷;如果所有條件都為false,則執(zhí)行 else 代碼塊。
public class IfElseIfDemo {
public static void main(String[] args) {
int score = 75;
String grade;
// 多分支判斷成績等級
if (score >= 90 && score <= 100) {
grade = "優(yōu)秀";
} else if (score >= 80 && score < 90) {
grade = "良好";
} else if (score >= 70 && score < 80) {
grade = "中等";
} else if (score >= 60 && score < 70) {
grade = "及格";
} else if (score >= 0 && score < 60) {
grade = "不及格";
} else {
grade = "無效成績";
}
System.out.println("你的成績等級是:" + grade); // 輸出中等
// 多分支判斷季節(jié)
int month = 10;
if (month >= 3 && month <= 5) {
System.out.println(month + "月屬于春季。");
} else if (month >= 6 && month <= 8) {
System.out.println(month + "月屬于夏季。");
} else if (month >= 9 && month <= 11) {
System.out.println(month + "月屬于秋季。");
} else if (month == 12 || month >= 1 && month <= 2) {
System.out.println(month + "月屬于冬季。");
} else {
System.out.println(month + "月是無效月份。");
}
}
}
注意事項(xiàng):
- 多分支的條件表達(dá)式之間應(yīng)避免重疊,確保邏輯嚴(yán)謹(jǐn)。
- else 代碼塊是可選的,如果不需要處理所有條件為 false 的情況,可以省略 else。
2.2 分支結(jié)構(gòu):switch 語句
switch語句是另一種分支結(jié)構(gòu),適用于對一個變量的多個固定值進(jìn)行判斷,語法簡潔,可讀性高。
(1)switch 語句基本語法
switch (表達(dá)式) {
case 常量值1:
// 表達(dá)式等于常量值1時執(zhí)行的代碼塊
break; // 跳出switch語句
case 常量值2:
// 表達(dá)式等于常量值2時執(zhí)行的代碼塊
break;
// 更多case語句
default:
// 表達(dá)式不等于任何常量值時執(zhí)行的代碼塊
break;
}
核心要求:
- 表達(dá)式的類型只能是:byte、short、int、char(及其包裝類)、String(JDK7 + 支持)、枚舉(Enum)。
- case 后的常量值必須唯一,且類型與表達(dá)式類型一致。
- break 語句用于跳出 switch 語句,避免執(zhí)行后續(xù) case 代碼塊(穿透現(xiàn)象)。
- default 語句是可選的,用于處理所有 case 不匹配的情況,位置可靈活放置(通常放在最后)。
public class SwitchBasicDemo {
public static void main(String[] args) {
// 整數(shù)類型的switch判斷
int week = 3;
String weekName;
switch (week) {
case 1:
weekName = "星期一";
break;
case 2:
weekName = "星期二";
break;
case 3:
weekName = "星期三";
break;
case 4:
weekName = "星期四";
break;
case 5:
weekName = "星期五";
break;
case 6:
weekName = "星期六";
break;
case 7:
weekName = "星期日";
break;
default:
weekName = "無效的星期數(shù)";
break;
}
System.out.println("今天是:" + weekName); // 輸出星期三
// 字符串類型的switch判斷(JDK7+)
String fruit = "蘋果";
switch (fruit) {
case "蘋果":
System.out.println("蘋果的單價是5元/斤。");
break;
case "香蕉":
System.out.println("香蕉的單價是3元/斤。");
break;
case "橙子":
System.out.println("橙子的單價是4元/斤。");
break;
default:
System.out.println("暫無該水果的價格信息。");
break;
}
}
}
(2)switch 語句的穿透現(xiàn)象
如果 case 語句后沒有添加 break 語句,會發(fā)生 “穿透現(xiàn)象”,即執(zhí)行完當(dāng)前 case 的代碼塊后,會繼續(xù)執(zhí)行后續(xù) case 的代碼塊,直到遇到 break 或 switch 語句結(jié)束。
穿透現(xiàn)象可用于處理多個 case 需要執(zhí)行相同代碼的場景,簡化代碼。
public class SwitchPenetrationDemo {
public static void main(String[] args) {
// 利用穿透現(xiàn)象判斷工作日/休息日
int week = 6;
switch (week) {
case 1:
case 2:
case 3:
case 4:
case 5:
System.out.println(week + "是工作日,需要上班。");
break;
case 6:
case 7:
System.out.println(week + "是休息日,可以休息。");
break;
default:
System.out.println("無效的星期數(shù)。");
break;
}
// 未添加break的穿透現(xiàn)象(慎用)
int num = 2;
switch (num) {
case 1:
System.out.println("執(zhí)行case 1");
case 2:
System.out.println("執(zhí)行case 2");
case 3:
System.out.println("執(zhí)行case 3");
default:
System.out.println("執(zhí)行default");
}
// 輸出:執(zhí)行case 2、執(zhí)行case 3、執(zhí)行default(穿透執(zhí)行)
}
}
(3)switch 語句與 if-else 語句的對比
| 對比維度 | switch 語句 | if-else 語句 |
|---|---|---|
| 適用場景 | 變量的多個固定值判斷 | 復(fù)雜的條件判斷(范圍、邏輯組合等) |
| 可讀性 | 變量多值判斷時可讀性更高 | 簡單條件判斷時可讀性高,復(fù)雜條件稍差 |
| 執(zhí)行效率 | 底層采用查找表 / 跳轉(zhuǎn)表,效率較高 | 依次判斷條件,效率與條件順序相關(guān) |
| 支持類型 | 有限類型(byte/short/int/char/String/ 枚舉) | 支持所有 boolean 類型的條件表達(dá)式 |
2.3 循環(huán)結(jié)構(gòu):for 循環(huán)
for 循環(huán)是最常用的循環(huán)結(jié)構(gòu),適用于已知循環(huán)次數(shù)的場景,語法格式清晰,便于控制循環(huán)過程。
(1)for 循環(huán)基本語法
for (初始化表達(dá)式; 條件表達(dá)式; 更新表達(dá)式) {
// 循環(huán)體:條件表達(dá)式為true時重復(fù)執(zhí)行的代碼塊
}
執(zhí)行流程:
- 執(zhí)行初始化表達(dá)式(僅執(zhí)行一次),用于初始化循環(huán)變量。
- 判斷條件表達(dá)式:
- 若為
true,執(zhí)行循環(huán)體代碼塊; - 若為
false,跳出循環(huán),結(jié)束 for 循環(huán)。
- 若為
- 執(zhí)行更新表達(dá)式,更新循環(huán)變量的值。
- 回到步驟 2,重復(fù)執(zhí)行,直到條件表達(dá)式為
false。
public class ForBasicDemo {
public static void main(String[] args) {
// 示例1:循環(huán)輸出1-5的數(shù)字
for (int i = 1; i <= 5; i++) {
System.out.println("i = " + i);
}
// 示例2:計算1-100的累加和
int sum = 0;
for (int num = 1; num <= 100; num++) {
sum += num;
}
System.out.println("1-100的累加和:" + sum); // 輸出5050
// 示例3:循環(huán)輸出數(shù)組元素
int[] arr = {10, 20, 30, 40, 50};
for (int j = 0; j < arr.length; j++) {
System.out.println("arr[" + j + "] = " + arr[j]);
}
// 示例4:倒序輸出10-1的數(shù)字
for (int k = 10; k >= 1; k--) {
System.out.println("k = " + k);
}
}
}
(2)增強(qiáng) for 循環(huán)(foreach 循環(huán))
增強(qiáng) for 循環(huán)(JDK5 + 支持)用于遍歷數(shù)組或集合中的元素,無需關(guān)心循環(huán)索引,語法簡潔,可讀性高。
語法格式:
for (元素類型 變量名 : 數(shù)組/集合) {
// 循環(huán)體:變量名表示當(dāng)前遍歷到的元素
}
public class ForEachDemo {
public static void main(String[] args) {
// 遍歷數(shù)組
int[] arr = {1, 3, 5, 7, 9};
System.out.println("數(shù)組元素:");
for (int element : arr) {
System.out.print(element + " ");
}
System.out.println(); // 輸出1 3 5 7 9
// 遍歷字符串?dāng)?shù)組
String[] names = {"張三", "李四", "王五", "趙六"};
System.out.println("姓名列表:");
for (String name : names) {
System.out.println(name);
}
// 增強(qiáng)for循環(huán)的限制:無法修改數(shù)組元素的值(僅獲取元素)
for (int num : arr) {
num *= 2; // 僅修改局部變量num,不會改變數(shù)組原元素
}
System.out.println("修改后數(shù)組元素:");
for (int element : arr) {
System.out.print(element + " ");
} // 仍輸出1 3 5 7 9
}
}
注意事項(xiàng):
- 增強(qiáng) for 循環(huán)只能用于遍歷,無法獲取數(shù)組索引,也無法修改數(shù)組元素的原值(基本數(shù)據(jù)類型)。
- 遍歷集合時,若在循環(huán)中修改集合(添加 / 刪除元素),會拋出
ConcurrentModificationException異常。
(3)for 循環(huán)的特殊形式
- 初始化表達(dá)式可以聲明多個同類型的循環(huán)變量,用逗號分隔。
- 更新表達(dá)式可以同時更新多個循環(huán)變量,用逗號分隔。
- 初始化表達(dá)式、條件表達(dá)式、更新表達(dá)式都可以省略(但分號不能省略),省略條件表達(dá)式表示無限循環(huán)。
public class ForSpecialDemo {
public static void main(String[] args) {
// 多個循環(huán)變量的for循環(huán)
for (int i = 0, j = 10; i <= 10 && j >= 0; i++, j--) {
System.out.println("i = " + i + ", j = " + j);
}
// 省略初始化表達(dá)式(循環(huán)變量已提前聲明)
int k = 1;
for (; k <= 5; k++) {
System.out.println("k = " + k);
}
// 省略更新表達(dá)式(在循環(huán)體內(nèi)更新)
int m = 1;
for (; m <= 5; ) {
System.out.println("m = " + m);
m++; // 手動更新循環(huán)變量
}
// 無限循環(huán)(需在循環(huán)體內(nèi)添加退出條件)
int n = 1;
for (;;) {
System.out.println("無限循環(huán):n = " + n);
n++;
if (n > 3) {
break; // 退出無限循環(huán)
}
}
}
}
2.4 循環(huán)結(jié)構(gòu):while 循環(huán)
while 循環(huán)適用于未知循環(huán)次數(shù)的場景,僅通過條件表達(dá)式控制循環(huán)的開始和結(jié)束。
(1)while 循環(huán)基本語法
初始化表達(dá)式;
while (條件表達(dá)式) {
// 循環(huán)體
更新表達(dá)式;
}
執(zhí)行流程:
- 執(zhí)行初始化表達(dá)式(僅執(zhí)行一次)。
- 判斷條件表達(dá)式:
- 若為
true,執(zhí)行循環(huán)體和更新表達(dá)式; - 若為
false,跳出循環(huán),結(jié)束 while 循環(huán)。
- 若為
- 回到步驟 2,重復(fù)執(zhí)行,直到條件表達(dá)式為
false。
public class WhileBasicDemo {
public static void main(String[] args) {
// 示例1:循環(huán)輸出1-5的數(shù)字
int i = 1;
while (i <= 5) {
System.out.println("i = " + i);
i++; // 更新循環(huán)變量
}
// 示例2:計算1-100的偶數(shù)和
int sumEven = 0;
int num = 1;
while (num <= 100) {
if (num % 2 == 0) {
sumEven += num;
}
num++;
}
System.out.println("1-100的偶數(shù)和:" + sumEven); // 輸出2550
// 示例3:未知次數(shù)循環(huán)(猜數(shù)字游戲)
int randomNum = (int) (Math.random() * 100) + 1; // 生成1-100的隨機(jī)數(shù)
int guessNum = 0;
java.util.Scanner scanner = new java.util.Scanner(System.in);
while (guessNum != randomNum) {
System.out.print("請輸入你猜測的數(shù)字(1-100):");
guessNum = scanner.nextInt();
if (guessNum > randomNum) {
System.out.println("猜大了,請繼續(xù)猜測!");
} else if (guessNum < randomNum) {
System.out.println("猜小了,請繼續(xù)猜測!");
} else {
System.out.println("恭喜你,猜對了!");
}
}
scanner.close();
}
}
注意事項(xiàng):
- 必須在循環(huán)體內(nèi)添加更新表達(dá)式,否則循環(huán)變量不會改變,會導(dǎo)致無限循環(huán)。
- 條件表達(dá)式的結(jié)果必須是
boolean類型,不能是其他類型。
2.5 循環(huán)結(jié)構(gòu):do-while 循環(huán)
do-while 循環(huán)是 while 循環(huán)的變種,特點(diǎn)是 “先執(zhí)行,后判斷”,無論條件是否滿足,循環(huán)體至少執(zhí)行一次。
(1)do-while 循環(huán)基本語法
初始化表達(dá)式;
do {
// 循環(huán)體
更新表達(dá)式;
} while (條件表達(dá)式);
執(zhí)行流程:
- 執(zhí)行初始化表達(dá)式(僅執(zhí)行一次)。
- 執(zhí)行循環(huán)體和更新表達(dá)式(至少執(zhí)行一次)。
- 判斷條件表達(dá)式:
- 若為
true,回到步驟 2,繼續(xù)循環(huán); - 若為
false,跳出循環(huán),結(jié)束 do-while 循環(huán)。
- 若為
public class DoWhileDemo {
public static void main(String[] args) {
// 示例1:循環(huán)輸出1-5的數(shù)字
int i = 1;
do {
System.out.println("i = " + i);
i++;
} while (i <= 5);
// 示例2:條件不滿足時,循環(huán)體仍執(zhí)行一次
int j = 6;
do {
System.out.println("j = " + j); // 會輸出j=6
j++;
} while (j <= 5);
// 示例3:用戶輸入驗(yàn)證(確保至少輸入一次)
java.util.Scanner scanner = new java.util.Scanner(System.in);
String password;
do {
System.out.print("請輸入密碼(6位數(shù)字):");
password = scanner.next();
} while (password.length() != 6 || !password.matches("\\d+"));
System.out.println("密碼輸入格式正確!");
scanner.close();
}
}
(2)while 循環(huán)與 do-while 循環(huán)的對比
| 對比維度 | while 循環(huán) | do-while 循環(huán) |
|---|---|---|
| 執(zhí)行順序 | 先判斷,后執(zhí)行 | 先執(zhí)行,后判斷 |
| 循環(huán)體執(zhí)行次數(shù) | 可能為 0 次(條件初始為 false) | 至少 1 次 |
| 適用場景 | 未知循環(huán)次數(shù),可能不執(zhí)行 | 未知循環(huán)次數(shù),必須執(zhí)行一次 |
2.6 循環(huán)控制語句:break 與 continue
break和continue語句用于靈活控制循環(huán)的執(zhí)行流程,break用于跳出循環(huán),continue用于跳過當(dāng)前循環(huán)的剩余部分,進(jìn)入下一次循環(huán)。
(1)break 語句
break語句有兩種用法:
- 跳出單層循環(huán):在循環(huán)體內(nèi)使用
break,直接跳出當(dāng)前循環(huán),結(jié)束循環(huán)執(zhí)行。 - 跳出多層循環(huán):通過標(biāo)簽(label)標(biāo)記外層循環(huán),在內(nèi)層循環(huán)中使用
break 標(biāo)簽名,跳出標(biāo)記的外層循環(huán)。
public class BreakDemo {
public static void main(String[] args) {
// 跳出單層for循環(huán)
for (int i = 1; i <= 10; i++) {
if (i == 6) {
break; // 當(dāng)i=6時,跳出循環(huán)
}
System.out.println("i = " + i); // 輸出1-5
}
// 跳出單層while循環(huán)
int j = 1;
while (j <= 10) {
if (j == 6) {
break;
}
System.out.println("j = " + j); // 輸出1-5
j++;
}
// 跳出多層循環(huán)(使用標(biāo)簽)
outer: // 外層循環(huán)標(biāo)簽
for (int m = 1; m <= 3; m++) {
inner: // 內(nèi)層循環(huán)標(biāo)簽
for (int n = 1; n <= 3; n++) {
if (m == 2 && n == 2) {
break outer; // 跳出外層循環(huán)
}
System.out.println("m = " + m + ", n = " + n);
}
}
// 輸出:m=1,n=1; m=1,n=2; m=1,n=3; m=2,n=1
}
}
(2)continue 語句
continue語句有兩種用法:
- 跳過當(dāng)前單層循環(huán):在循環(huán)體內(nèi)使用
continue,跳過當(dāng)前循環(huán)的剩余代碼,直接進(jìn)入下一次循環(huán)。 - 跳過當(dāng)前多層循環(huán)的內(nèi)層:通過標(biāo)簽標(biāo)記外層循環(huán),使用
continue 標(biāo)簽名,跳過內(nèi)層循環(huán),直接進(jìn)入外層循環(huán)的下一次迭代。
public class ContinueDemo {
public static void main(String[] args) {
// 跳過當(dāng)前for循環(huán)(輸出1-10的奇數(shù))
for (int i = 1; i <= 10; i++) {
if (i % 2 == 0) {
continue; // 跳過偶數(shù),直接進(jìn)入下一次循環(huán)
}
System.out.println("奇數(shù):" + i); // 輸出1、3、5、7、9
}
// 跳過當(dāng)前while循環(huán)
int j = 0;
while (j < 10) {
j++;
if (j % 2 == 0) {
continue;
}
System.out.println("奇數(shù):" + j); // 輸出1、3、5、7、9
}
// 跳過內(nèi)層循環(huán)(使用標(biāo)簽)
outer:
for (int m = 1; m <= 3; m++) {
for (int n = 1; n <= 3; n++) {
if (n == 2) {
continue outer; // 跳過內(nèi)層循環(huán)剩余部分,進(jìn)入外層循環(huán)下一次迭代
}
System.out.println("m = " + m + ", n = " + n);
}
}
// 輸出:m=1,n=1; m=2,n=1; m=3,n=1
}
}
2.7 循環(huán)嵌套
循環(huán)嵌套是指在一個循環(huán)體內(nèi)包含另一個完整的循環(huán),外層循環(huán)控制循環(huán)的輪數(shù),內(nèi)層循環(huán)控制每輪的執(zhí)行次數(shù)。常見的有 for-for 嵌套、for-while 嵌套等,適用于處理二維數(shù)據(jù)(如二維數(shù)組)、矩陣運(yùn)算等場景。
public class LoopNestingDemo {
public static void main(String[] args) {
// 示例1:打印九九乘法表
for (int i = 1; i <= 9; i++) { // 外層循環(huán):控制行數(shù)
for (int j = 1; j <= i; j++) { // 內(nèi)層循環(huán):控制每行的列數(shù)
System.out.print(j + "×" + i + "=" + (i * j) + "\t");
}
System.out.println(); // 換行
}
// 示例2:打印矩形(5行8列*)
for (int row = 1; row <= 5; row++) {
for (int col = 1; col <= 8; col++) {
System.out.print("*");
}
System.out.println();
}
// 示例3:遍歷二維數(shù)組
int[][] twoDArr = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
for (int i = 0; i < twoDArr.length; i++) {
for (int j = 0; j < twoDArr[i].length; j++) {
System.out.print(twoDArr[i][j] + " ");
}
System.out.println();
}
}
}
注意事項(xiàng):
- 循環(huán)嵌套的層數(shù)不宜過多(通常不超過 3 層),否則會導(dǎo)致代碼可讀性下降和性能損耗。
- 外層循環(huán)和內(nèi)層循環(huán)的循環(huán)變量不能重名,避免變量沖突。
三、總結(jié)
- 運(yùn)算符是 Java 程序的運(yùn)算基礎(chǔ),按功能可分為算術(shù)、關(guān)系、邏輯、賦值、三元運(yùn)算符等,使用時需注意優(yōu)先級、結(jié)合性,以及強(qiáng)制類型轉(zhuǎn)換的溢出和精度丟失問題。
- 流程控制分為分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu),
if-else適用于復(fù)雜條件判斷,switch適用于變量多固定值判斷;for適用于已知循環(huán)次數(shù),while/do-while適用于未知循環(huán)次數(shù)。 break用于跳出循環(huán),continue用于跳過當(dāng)前循環(huán)剩余部分,循環(huán)嵌套適用于處理二維數(shù)據(jù)等復(fù)雜場景,合理使用這些語句能靈活掌控程序執(zhí)行邏輯。- 實(shí)際開發(fā)中,應(yīng)根據(jù)業(yè)務(wù)場景選擇合適的運(yùn)算符和流程控制語句,注重代碼的可讀性和邏輯嚴(yán)謹(jǐn)性,避免無限循環(huán)、條件重疊等常見錯誤。
到此這篇關(guān)于Java運(yùn)算符與流程控制之全類型運(yùn)算符用法及分支/循環(huán)語句實(shí)戰(zhàn)指南的文章就介紹到這了,更多相關(guān)Java運(yùn)算符用法及分支/循環(huán)語句內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
spring boot--從controller到DAO操作
這篇文章主要介紹了spring boot--從controller到DAO操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06
java編程SpringSecurity入門原理及應(yīng)用簡介
Spring 是非常流行和成功的 Java 應(yīng)用開發(fā)框架,Spring Security 正是 Spring 家族中的成員。Spring Security 基于 Spring 框架,提供了一套 Web 應(yīng)用安全性的完整解決方案2021-09-09
Java判斷中英文符號、標(biāo)點(diǎn)的實(shí)現(xiàn)
本篇文章主要介紹了Java判斷中英文符號、標(biāo)點(diǎn)的實(shí)現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-10-10
Java實(shí)現(xiàn)經(jīng)典游戲超級瑪麗的示例代碼
在你的童年記憶里,是否有一個蹦跳、頂蘑菇的小人?本文將用java語言實(shí)現(xiàn)經(jīng)典游戲《超級瑪麗》,文中采用了swing技術(shù)進(jìn)行了界面化處理,需要的可以參考一下2022-02-02
Alibaba?Nacos配置中心動態(tài)感知原理示例解析
這篇文章主要介紹了Alibaba?Nacos配置中心動態(tài)感知原理示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08
Java9新特性Stream流API優(yōu)化與增強(qiáng)
這篇文章主要為大家介紹了Java9新特性Stream流API優(yōu)化與增強(qiáng)的用法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助祝大家多多進(jìn)步,早日升職加薪2022-03-03

