其实很简单: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。就可以解决了这个问题了。

总结:三者的区别列表

breakcontinuereturn
作用范围结束当前层循环。不能结束循环结束当前函数循环
差异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++)
{return;}
int val=0;
return就是直接跳出了当前函数。

如果你有更好的实现方式,你也可以在留言中说明。

以上是关于其实很简单:Java中breakcontinue和return的差异的主要内容,如果未能解决你的问题,请参考以下文章

JAVA breakcontinue和return的区别

关于breakcontinue和return

04Java基础语法(循环嵌套breakcontinue方法方法的重载数组动态初始化)

这么说吧,java线程池的实现原理其实很简单

08_Python的控制判断循环语句2(breakcontinue)_Python编程之路

while循环中的breakcontinue和else