Java中while循环内的return为何会直接跳出外层for循环?
最长公共前缀求解中return与break的行为差异问题
问题现象
测试输入为["baab","bacb","b","cbc"]时出现如下不符合预期的运行结果:
- while循环内使用
break关键字,程序返回正确结果空字符串"" - while循环内使用
return关键字,程序返回错误结果"ba"
原有认知偏差:误以为内层while循环中的return和break作用类似,仅跳出当前while循环、不会退出外层for循环,实际运行时return直接跳出了外层for循环。
问题对应代码
class Solution { public String longestCommonPrefix(String[] strs) { String first=strs[0]; for(int i=1;i<=strs.length-1;i++){ char[] c1 = first.toCharArray(); char[] c2 = strs[i].toCharArray(); int index=0; first=""; int len=0; if(c1.length<c2.length) len=c1.length; else len=c2.length; if(len==0){ return first; } while(index<=len-1){ if(c1[index]==c2[index]){ first=first+c1[index]; }else{ return first; } index++; } } return first; } }
根本原因
Java中break和return是作用完全不同的两个关键字,不存在“return仅跳出内层循环”的逻辑:
break的作用范围仅限当前所处的最内层循环/switch结构,执行break后只会终止当前while循环,程序会回到外层for循环,继续执行下一轮迭代、对比后续字符串。return的作用范围是整个方法,只要执行return,无论当前嵌套了多少层循环、多少层代码块,都会直接终止当前方法的执行,把return后跟的值作为整个方法的返回值返回,不会再执行方法内return之后的任何代码,自然也不会继续跑外层for循环的剩余迭代。
结合测试用例的执行流程可以直观看到差异:
- 初始
first取数组第一个元素"baab",第一轮for循环i=1,对比第二个字符串"bacb" - 逐位匹配:index=0时两边字符均为
b,first拼接为"b";index=1时两边字符均为a,first拼接为"ba";index=2时c1字符为a、c2字符为c,匹配失败 - 此处如果写
break:跳出while循环,继续执行for循环i=2的迭代,对比第三个字符串"b",匹配后first更新为"b";再进入i=3迭代对比第四个字符串"cbc",首字符就不匹配,first变为空字符串,遍历完所有元素后返回空,结果正确 - 此处如果写
return first:在i=1匹配失败的节点就直接把当前值"ba"作为整个方法的返回值,后续i=2、i=3的字符串对比逻辑完全不会执行,最终返回错误结果。
内容的提问来源于stack exchange,提问作者user1326784
相关产品推荐
相关产品推荐

