掌握
- 掌握if语句语法
- 掌握if…else语句语法
- 掌握if…else if…else语句语法
- 掌握switch case语句语法和原理
if语句
- 语法
if (布尔表达式) {
代码块;
}
-
说明
- 布尔表达式为true:执行代码块,执行结束后,程序继续向下执行
- 布尔表达式为false:不执行代码块,程序直接向下执行
-
示例:布尔表达式为true
public class Example {
public static void main(String[] args) {
if (true){
System.out.println("执行代码块");
}
System.out.println("执行程序");
}
}
执行结果:
执行代码块
执行程序
- 示例:布尔表达式为false
public class Example {
public static void main(String[] args) {
if (false){
System.out.println("执行代码块");
}
System.out.println("执行程序");
}
}
执行结果:
执行程序
if…else语句
- 语法
if (布尔表达式) {
代码块A;
}else {
代码块B;
}
-
说明
- 布尔表达式为true:只执行代码块A,执行结束后,程序继续向下执行
- 布尔表达式为false:只执行代码块B,执行结束后,程序继续向下执行
-
示例:布尔表达式为true
public class Example {
public static void main(String[] args) {
if (true){
System.out.println("执行代码块A");
}else {
System.out.println("执行代码块B");
}
System.out.println("执行程序");
}
}
执行结果:
执行代码块A
执行程序
- 示例:布尔表达式为false
public class Example {
public static void main(String[] args) {
if (false){
System.out.println("执行代码块A");
}else {
System.out.println("执行代码块B");
}
System.out.println("执行程序");
}
}
执行结果:
执行代码块B
执行程序
if…else if…else语句
- 语法
if (布尔表达式a) {
代码块A;
}else if (布尔表达式b) {
代码块B;
}else if (布尔表达式c) {
代码块C;
}else {
代码块D;
}
-
说明
- if开头,else结尾,中间else if可以有多个
- 顺序判断布尔表达式,遇到true时,执行对应的代码块后结束整个语句,不再继续判断
- 顺序判断布尔表达式,全部false时,执行else的代码块后结束整个语句
-
示例:遇到true
public class Example {
public static void main(String[] args) {
if (false){
System.out.println("执行代码块A");
}else if (true){
System.out.println("执行代码块B");
}else if (true){
System.out.println("执行代码块C");
}else {
System.out.println("执行代码块D");
}
System.out.println("执行程序");
}
}
执行结果:
执行代码块B
执行程序
- 示例:全部false
public class Example {
public static void main(String[] args) {
if (false){
System.out.println("执行代码块A");
}else if (false){
System.out.println("执行代码块B");
}else if (false){
System.out.println("执行代码块C");
}else {
System.out.println("执行代码块D");
}
System.out.println("执行程序");
}
}
执行结果:
执行代码块D
执行程序
switch case语句
- 语法
switch (变量) {
case 变量值 :
语句;
break;
case 变量值 :
语句;
break;
default :
语句;
}
-
说明
- switch()接收变量,目前支持类型:byte,short,char,int,Byte,Short,Character,Integer,Enum,String
- case的数量不限
- case的变量值必须是不同的字面常量或者常量
- case的变量值的数据类型与变量的数据类型相同
- break跟随case,非必须
- break为case匹配成功后跳出switch语句的标识
- default为默认分支,非必须
- 顺序匹配case,全部失败,default存在则执行default语句,default不存在则结束switch语句
- 顺序匹配case,遇到成功,则从当前case开始顺序执行后续语句,后面存在break则执行到break处结束switch语句,后面不存在break则执行后续全部语句,包括default语句
-
示例:case全部失败,default存在(不存在略)
public class Example {
final static int X = 2;
public static void main(String[] args) {
int x = 10;
switch (x){
case 1 ://字面常量
System.out.println("1分支");
case X ://常量
System.out.println("2分支");
case 3 ://字面常量
System.out.println("3分支");
default :
System.out.println("default分支");
}
}
}
执行结果:
default分支
- 示例:case遇到成功,break存在
public class Example {
final static int X = 2;
public static void main(String[] args) {
int x = 1;
switch (x){
case 1 ://字面常量
System.out.println("1分支");
case X ://常量
System.out.println("2分支");
break;
case 3 ://字面常量
System.out.println("3分支");
default :
System.out.println("default分支");
}
}
}
执行结果:
1分支
2分支
- 示例:case遇到成功,break不存在
public class Example {
final static int X = 2;
public static void main(String[] args) {
int x = 1;
switch (x){
case 1 ://字面常量
System.out.println("1分支");
case X ://常量
System.out.println("2分支");
case 3 ://字面常量
System.out.println("3分支");
default :
System.out.println("default分支");
}
}
}
执行结果:
1分支
2分支
3分支
default分支
switch case拓展
- 底层原理
- switch语句底层通过数组实现,通常把这个数组叫做跳转表
- 数组长度规则:case最大值-case最小值+1
- 数组元素规则:每个case会执行的代码段地址(代码段依据break的位置来搜集)
- 选取元素规则:入参变量值-case最小值=index,通过index在数组中选取元素(不能选取时返回default代码段地址)
- 示例
public class Example {
public static void main(String[] args) {
int x = 1;
switch (x){
case 5 :
System.out.println("代码段5");
break;
case 3 :
System.out.println("代码段3");
case 2 :
System.out.println("代码段2");
break;
case 1 :
System.out.println("代码段1");
default :
System.out.println("default代码段");
}
}
/**
* 解析
* 根据数组长度规则和数组元素规则解析整个switch语句得到数组
* arr = [代码段1+default代码段, 代码段2, 代码段3+代码段2, default代码段, 代码段5]
* arr[0]对应case1,存放代码段1和default代码段
* arr[1]对应case2,存放代码段2
* arr[2]对应case3,存放代码段3和代码段2
* arr[3]无对应case,存放default代码段
* arr[4]对应case5,存放代码段5
* 根据元素选取规则,选取要执行的代码段地址,arr[x - 1] = arr[0],则要执行的代码段为代码段1和default代码段
*/
}
执行结果:
代码段1
default代码段
-
如何支持String类型
- switch核心逻辑不变
- 增加String类型的处理逻辑,将String转换为hash值,将hash值代入switch核心逻辑
-
如何支持Enum类型
- switch核心逻辑不变
- 增加Enum类型的处理逻辑,将Enum转换为数组,为每个属性分配索引,将索引值代入switch核心逻辑