加深 | Java中“if”与“switch”

首先:Java来源于C++,所以也保留了C++的部分特性。
那么if……语句/switch……case,又有什么的区别呢?
问题来源:
LeetCode13题——罗马数字转换
然后我的解决办法中就出现了这样两种:

 for(int i=0;i<ch.length-1;i++){
            if((ch[i]=='I')&&(ch[i+1]=='V'||ch[i+1]=='X')){
                sum-=2;
            }
            if(ch[i]=='X'&&(ch[i+1]=='L'||ch[i+1]=='C')){
                sum-=20;
            }
            if(ch[i]=='C'&&(ch[i+1]=='D'||ch[i+1]=='M')){
                sum-=200;
            }
           
        }

3999 / 3999 个通过测试用例状态:
通过执行用时: 4 ms
内存消耗: 39.8 MB

也想到switch

 for(int i=0;i<ch.length-1;i++){
         switch(""+ch[i]+ch[i+1]) {
         case "IV":
         case "IX":
          sum-=2;
          break;
         case "XL":
         case "XC":
          sum-=20;
          break;
         case "CD":
         case "CM":
          sum-=200;
          break;
         
         }
        }

3999 / 3999 个通过测试用例状态:
通过执行用时: 10 ms
内存消耗: 40.6 MB
所以认为:switch比if判断要慢。

事实上:switch比if……快

理论基础:(1)ifelse()中,采用的方法是按顺序比较,如满足条件,则执行对应的代码,否则跳转到下一个分支再进行比较!

if else语句需要一条一条的去进行取值范围的判断,直到找到正确的选项位置,这样的话势必会浪费大量的时间。
单从其运行的效率来看,if else 的时间复杂度为O(n),即最坏的情况下判断n次,switch的时间复杂度为O(1),switch语句要更胜一筹。

(2)switch取值不同但是跳转的地址一定是编译阶段就被设定好*
switch会生成一个数据统计表,将case后面的值全部统计起来,匹配时先拿表中的数据进行比较,如果有则直接跳转到相应case语句;如果没有,则直接跳转到default语句。即:switch语句在运行时,首先会生成一个“跳转表”来指示实际的case分支的地址,而这个“跳转表”的索引号与swtich中的case值是相等的,这样的话,switch就不用像if else那样,遍历所有的条件,直至找到正确条件,而仅仅只需要访问对应索引号的表项就可以到达定位分支的目的。
(3)switch…case…执行效率高,属于典型的以空间换时间。也就是说,(套用算法的行话)以提高空间复杂度为代价降低了时间复杂度。

那为什么会出现罗马题目的不一样呢?
后来发现是:用的switch方法中,用的是数组转化成字符后再比较所以结果不一样。
简单总结:
1.switch语句由于它独特的case值判断方式,使其执行效率更高,而if else语句呢,则由于判断机制,导致效率稍慢。
2.到底使用哪一个选择语句,和当前的代码环境有关,如果是范围取值,则使用if else语句更为快捷;如果是确定取值,则使用switch更是一个不错的选择。
出自链接:1.https://www.cnblogs.com/idorax/p/6275259.html
2。https://blog.csdn.net/weixin_43654258/article/details/86588630?utm_source=app

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值