Java条件执行

条件执行就是只有在某些条件满足的情况下执行,在一些条件下执行某种操作,在另外一些条件下执行另外某种操作。

Java中表达这种流程控制的基本语法是If语句。

if

if(条件语句){
  代码块
}

它表达的含义也非常简单,只在条件语句为真的情况下,才执行后面的代码,为假就不做了。

if/else

if实现的是条件满足的时候做什么操作,如果需要根据条件做分支,即满足的时候执行某种逻辑,而不满足的时候执行另一种逻辑,则可以用if/else。

if(判断条件){
   代码块1
}else{
   代码块2
}

三元运算符

判断条件 ? 表达式 1 : 表达式2

三元运算符会得到一个结果,判断条件为真的时候就返回表达式1的值,否则就返回表达式2的值。三元运算符经常用于对某个变量赋值,例如求两个数的最大值:

int max = x > y ? x : y;

if/else if/else

如果有多个判断条件,而且需要根据这些判断条件的组合执行某些操作,则可以使用if/else if/else。

if(条件1){
  代码块1
}else if(条件2){
  代码块2
}...
else if(条件n){
   代码块n
}else{
   代码块n+1
}

需要注意的是,在if/else if/else中,判断的顺序是很重要的,后面的判断只有在前面的条件为false的时候才会执行。

switch

switch(表达式){
   case 值1:
           代码1; break;
   case 值2:
           代码2; break;
           ...
    case 值n:
          代码n; break;
    default: 代码n+1
}

switch也比较简单,根据表达式的值执行不同的分支,具体来说,根据表达式的值找匹配的case,找到后,执行后面的代码,碰到break时结束,如果没有找到匹配的值则执行default中的语句。

表达式值的数据类型只能是 byte, short, int, char, 枚举, 和String (Java 1.7以后)。

条件执行的本质

程序最终都是一条条的指令,CPU有一个指令指示器,指向下一条要执行的指令,CPU根据指示器的指示加载指令并且执行。指令大部分是具体的操作和运算,在执行这些操作时,执行完一个操作后,指令指示器会自动指向挨着的下一个指令。

但有一些特殊的指令,称为跳转指令,这些指令会修改指令指示器的值,让CPU跳到一个指定的地方执行。跳转有两种,一种是条件跳转,另一种是无条件跳转。条件跳转检查某个条件,满足则进行跳转,无条件跳转则是直接进行跳转。

if, else实际上会转换为这些跳转指令,比如说下面的代码:

int a=10;
if(a%2==0)
{
   System.out.println("偶数");
}
//其他代码

转换到的跳转指令可能是:

int a=10;
条件跳转: 如果a%2==0,跳转到第4行
无条件跳转:跳转到第7行
{
   System.out.println("偶数");
}
//其他代码

if, if/else, if/else if/else, 三元运算符都会转换为条件跳转和无条件跳转。但switch不太一样。

switch的转换和具体系统实现有关,如果分支比较少,可能会转换为跳转指令。但如果分支比较多,使用条件跳转会进行很多次的比较运算,效率比较低,可能会使用一种更为高效的方式,叫跳转表。跳转表是一个映射表,存储了可能的值以及要跳转到的地址,形如:

值1代码块1的地址
值2代码块2的地址
... 
值n代码块n的地址

跳转表为什么会更为高效呢?因为,其中的值必须为整数,且按大小顺序排序。按大小排序的整数可以使用高效的二分查找,即先与中间的值比,如果小于中间的值则在开始和中间值之间找,否则在中间值和末尾值之间找,每找一次缩小一倍查找范围。如果值是连续的,则跳转表还会进行特殊优化,优化为一个数组,连找都不用找了,值就是数组的下标索引,直接根据值就可以找到跳转的地址。即使值不是连续的,但数字比较密集,差的不多,编译器也可能会优化为一个数组型的跳转表,没有的值指向default分支。

程序源代码中的case值排列不要求是排序的,编译器会自动排序。

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值