其实很简单:Java中breakcontinue和return的差异
Posted 沛沛老爹
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了其实很简单:Java中breakcontinue和return的差异相关的知识,希望对你有一定的参考价值。
前言
在开发中,对于终止程序执行的操作是很重要的。
特别是在大量的判断的条件下。
在终止当前语句执行的关键字有break、continue和return。
正确的使用他们可以让你的程序在执行和判断上会更加的优雅
到底什么时候用哪个呢?
下面我们简单说明下break、continue、return三者的区别和联系。
先上个简单的例子来说明下。
研发背景(示例)
现在假如我们有一个商品参数数组列表,假设每行数据的格式如下
"产地:法国","编号:42342345","法国进口","1855列级庄","其它,巧克力香型,果香型,烘烤香型","干型","葡萄酒赤霞珠(Cabernet Sauvignon),梅洛(Merlot)",酸度中酸","新/旧世界旧世界","口感饱满","颜色宝石红","甜度干型"
并且每行的数据内容都不尽相同。
然后根据业务的需要,我们需要剔除部分数据,然后组成新的一列。
例如需要剔除包含“产地”,“编号”,“香型”,"厂家",“厂址”这些数据。
示例代码
continue
//伪代码
String[] keyArr = keys.split("_");
String[] outKeyArr = {"名称","厂","毛重","容量","醒酒时间","规格","联系方式","编号","包装","保质期","品牌","系列","分级","新/旧世界"};
StringBuffer sbKey= new StringBuffer();
//判断当前包含的话,就不放到sbKey中。
for(String key:keyArr ){
for(String outkey:outKeyArr) {
if(key.contains(outkey))
{
// TODO
//判断当前包含则跳出,重新进行二次判断
continue;
}
}
sbKey.append(key);
}
在这个地方,大家会发现,如果使用continue,则会一直在for(String outkey:outKeyArr)里面打转转,而且一直返回不出来。如果数据比较大,会很影响性能。
而且,还不能解决当前的这个需求?
你继续debug执行代码会发现,outKeyArr的数组无法清除,还是会继续写入到sbKey中。进入到sbKey.append(key)这行代码中。
你感觉自己就像玩了个寂寞...
为什么?
因为如果把continue放到for(String outkey:outKeyArr)里面,它的作用域就只有在for(String outkey:outKeyArr)里面。它不能影响for(String key:keyArr )的执行次数。
return
那用return可以解决么?
//伪代码
String[] keyArr = keys.split("_");
String[] outKeyArr = {"名称","厂","毛重","容量","醒酒时间","规格","联系方式","编号","包装","保质期","品牌","系列","分级","新/旧世界"};
StringBuffer sbKey= new StringBuffer();
//判断当前包含的话,就不放到sbKey中。
for(String key:keyArr ){
for(String outkey:outKeyArr) {
if(key.contains(outkey))
{
// TODO
//判断当前包含则跳出,重新进行二次判断
return;
}
}
sbKey.append(key);
}
执行这段代码,你会发现,只要触发了return。当前方法就over了。根本就到达不了sbKey.append(key)这行代码。
因为return的作用域是无视代码块,直接跳出了当前函数,直接进入到调用这个函数的里面去了。
break
break是否能解决呢?
String[] outKeyArr= {"名称","厂","毛重","容量","醒酒时间","规格","联系方式","编号","包装","保质期","品牌","系列","分级","新/旧世界"};
String[] keyArr = {"产地:法国","编号:42342345","法国进口","1855列级庄","其它,巧克力香型,果香型,烘烤香型","干型","葡萄酒赤霞珠(Cabernet Sauvignon),梅洛(Merlot)","酸度中酸","新/旧世界旧世界","口感饱满","颜色宝石红","甜度干型"};
StringBuilder sbKey= new StringBuilder();
for(String key:keyArr) {
for (String outKey: outKeyArr) {
if (key.contains(outKey)) {
break;
}
}
sbKey.append(key);
}
System.out.println(sbKey.toString());
最后发现还是玩了个寂寞,还是把所有的都输出来了。
小结
为什么都失败了?
其实,break实现了从for (String outKey: outKeyArr)中跳出的逻辑,但是我们for有两层,所以,在判断的时候需要分别对两个for进行判断。
for的逻辑操作(所有的逻辑操作都是如此),必须先计算内部的,再计算外部的。
break已经把内部的解决了,现在的外部问题就需要去用新的角度去思考,即屏蔽内部代码的角度去看外部的。
我们发现,外部 for(String key:keyArr)只要满足内部的for (String outKey: outKeyArr),就需要跳出本次循环,继续进行下次循环。
跳出本次循环,继续进行下次循环那就用continue。
但是什么时候执行continue呢?
这里我们可以设置一个位置变量,默认是不执行continue的。当内部的for (String outKey: outKeyArr)的if (key.contains(outKey))为true时,则说明当前key是不能放进去的,则需要摒弃到sbKey之外。
代码实现
String[] keyAr = {"名称","厂","毛重","容量","醒酒时间","规格","联系方式","编号","包装","保质期","品牌","系列","分级","新/旧世界"};
String[] keyArr = {"产地:法国","编号:42342345","法国进口","1855列级庄","其它,巧克力香型,果香型,烘烤香型","干型","葡萄酒赤霞珠(Cabernet Sauvignon),梅洛(Merlot)","酸度中酸","新/旧世界旧世界","口感饱满","颜色宝石红","甜度干型"};
StringBuilder sbKey= new StringBuilder();
for(String key:keyArr) {
boolean flag = false;
for (String d : keyAr) {
if (key.contains(d)) {
flag = true;
break;
}
}
if(flag) continue;
sbKey.append(key);
}
System.out.println(sbKey.toString());
就在中间设置一个flag。然后组合continue和break。就可以解决了这个问题了。
总结:三者的区别列表
break | continue | return | |
作用范围 | 结束当前层循环。 | 不能结束循环 | 结束当前函数循环 |
差异 | 1、只能跳出一层循环,如果你的循环是嵌套循环,那么你需要按照你嵌套的层次,逐步使用break来跳出。 2、break在循环体内,强行结束循环的执行,也就是结束整个循环过程,不在判断执行循环的条件是否成立,直接转向循环语句下面的语句。 | 1、终止本次循环的执行,即跳过当前这次循环中continue语句后尚未执行的语句,接着进行下一次循环条件的判断。 2、终止当前的循环过程,但并不跳出循环,而是继续往下判断循环条件执行语句.他只能结束循环中的一次过程,但不能终止循环继续进行. | 1、return 从当前的方法中退出,返回到该调用的方法的语句处,继续执行。 2、return 返回一个值给调用该方法的语句,返回值的数据类型必须与方法的声明中的返回值的类型一致。当然,不返回值也是可以的。 |
示例 | for(a){break;} int val=0; break的作用语句就是跳出当前for(a),直接进入到int val =0; | for(int i;i<a;i++) {continue;} int val=0; continue的作用语句就是跳出当前for(a=1),直接进入到for(a=2); | for(int i;i<a;i++) |
如果你有更好的实现方式,你也可以在留言中说明。
以上是关于其实很简单:Java中breakcontinue和return的差异的主要内容,如果未能解决你的问题,请参考以下文章
04Java基础语法(循环嵌套breakcontinue方法方法的重载数组动态初始化)