首先: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