晋中网站建设哪家强营销型网站建站推广
条件/选择结构
if
if(条件表达式){// 表达式为 true 时,执行该代码块
}
if(true) {System.out.println("hello");
}
if else
if(条件表达式){// 表达式为 true 时,执行该代码块
} else {// 表达式为 false 时,执行该代码块
}
if(1 == 2) {System.out.println("hello");
} else {System.out.println("hello,world");
}
if else if else
注意判断的顺序,后面的判断只有在前面的条件为 false 时才执行。
if(条件表达式1){// 表达式1为 true 时,执行该代码块
} else if(条件表达式2) {// 表达式2为 true 时,执行该代码块
} else {// 上述表达式都为 false 时,执行该代码块
}
int score = 70;if(score >= 90) {System.out.println("优秀");
} else if(score >= 80) {System.out.println("良好");
} else if(score >= 70) {System.out.println("一般");
} else if(score >= 60) {System.out.println("及格");
} else {System.out.println("不及格");
}
⭐switch(express) case
根据表达式的值匹配 case,匹配后执行后面的代码,遇到 break 结束,没有匹配的值则执行 default 后的语句。
case 值的类型可以是:byte
、short
、int
、char
(判断时转为整数)、枚举(Enum,有对应的整数)、String( 1.7 后。通过 hashcode 转换为整数比较,如果相同,再根据内容判断)。
case 语句中的值的数据类型必须与变量的数据类型相同,而且只能是常量或者字面常量。
case 中的语句碰到 break 或者执行完后续所有语句才会停止,case 语句后面通常会加 break,也可利用这种特性( case 穿透)。
switch(条件) {case 情况1:语句1;break;// ...default:// 默认语句;
}
int month = 6;
switch(month) {case 3:case 4:case 5:// case 穿透System.out.println("春天");break;case 6:case 7:case 8:System.out.println("夏天");break;case 9:case 10:case 11:System.out.println("秋天");break;default:System.out.println("冬天");
}
循环结构
while
while(条件表达式){// 表达式为 true 时,执行该循环体代码块
}
int i = 7;
while(i > 5){System.out.println(i);i--;
}
do while
do {// 先不判断执行一次该循环体代码块,后面表达式为 true 时,执行该循环体代码块
} while(条件表达式)
int i = 5;
do {System.out.println(i);i--;
} while(i > 5);
for
for(初始化语句;判断循环条件;改变循环条件){// 循环条件判断为 true 时,执行该循环体代码块
}
for(int i = 0;i < 7;i++){System.out.println(i);
}
foreach
JDK1.5 引进了一种新的循环方式,称为 foreach 循环或者加强型循环。
foreach 不是一个关键字,它使用下面的形式来遍历数组或集合。
int[] arr = {1, 2, 3, 4};
for(int ele: arr) {System.out.println(ele);
}
循环控制
continue
:跳过本次循环
for(int i = 0;i < 7;i++){if(i==3) continue;System.out.println(i);
}
break
:结束循环
for(int i = 0; i < 7; i++){if(i == 3) break;System.out.println(i);
}
注意:break 后,i++ 不会再执行。
return
:结束方法执行
lable 标记
Java 语言允许语句的前面有标签(label),相当于定位符,用于跳转到程序的任意位置,格式如下:
label:
语句;
标签可以是任意的标识符,但不能是保留字,语句部分可以是任意语句。
标签通常与 break 语句和 continue 语句配合使用,用于跳出特定的循环。
outer:
for (int i = 0; i < 3; i++){for (int j = 0; j < 3; j++){if (i == 1 && j == 1) {break outer;}System.out.println("i=" + i + ", j=" + j);}
}
// i=0, j=0
// i=0, j=1
// i=0, j=2
// i=1, j=0
上面代码为一个双重循环区块,break 命令后面加上了 outer 标签。
满足条件时,直接跳出双层循环。如果 break 语句后面不使用标签,则只能跳出内层循环,进入下一次的外层循环。
continue 语句也可以与标签配合使用,满足条件时,会跳过当前循环,直接进入下一轮外层循环。如果 continue 语句后面不使用标签,则只能进入下一轮的内层循环。
⭐跳转指令
程序运行时,实际是一条条的指令,CPU 有一个 指令指示器,指向下一条要执行的指令,CPU 根据指示器的指示加载指令并且执行。
大部分指令是具体的操作和运算,在执行这些操作时,执行完一个操作后,指令指示器会自动指向下一条指令。
但有一些特殊的指令,称为 跳转指令,这些指令会修改指令指示器的值,让 CPU 跳到一个指定的地方执行。
跳转有两种:一种是条件跳转
,条件跳转检查某个条件,满足则进行跳转;另一种是无条件跳转
,无条件跳转是直接进行跳转。
选择结构和循环结构最终会转为这些跳转指令,比如:
int a = 10;
if( a % 2 == 0 ){System.out.println("偶数");
}
System.out.println("其它代码");
转换后的指令可能是:
int a = 10;
条件跳转:如果 a % 2 == 0,跳转到第 4 行
无条件跳转:跳转到第 5 行
System.out.println("偶数");
System.out.println("其它代码");
switch 的转换和具体系统实现有关。如果分支较少,可能会转为跳转指令;如果分支较多,条件跳转会进行多次的比较运算,效率比较低,可能会使用一种更高效的方式,叫跳转表
。
跳转表是一个映射表,存储了可能的值(统一转为整数)以及要跳转的地址,跳转表值的存储空间一般为 32 位,容纳不下 long。
条件值 | 跳转地址 |
---|---|
条件1 | 代码块1的地址 |
条件2 | 代码块2的地址 |
switch 表达式实质是整型值得比较,跳转表可以进行二分查找,为此,跳转表会进行排序,如果值比较连续的,还会进一步优化为数组,可以根据索引直接进行跳转。