java这个代码可能导致无限循环吗?
是否有任何值可以分配给myString
变量,从而在下面的代码中产生无限循环
while (true) {
if (myString.indexOf(" ") == -1) {
break;
}
myString = myString.replaceAll(" ", " ");
}
你可以在下面搜索框中键入要查询的问题!
是否有任何值可以分配给myString
变量,从而在下面的代码中产生无限循环
while (true) {
if (myString.indexOf(" ") == -1) {
break;
}
myString = myString.replaceAll(" ", " ");
}
# 1 楼答案
不,这不可能发生。你可以通过对字符串长度的归纳来证明这一点
基本上可以归结为以下观察结果:
myString
在循环的每次迭代中变短(用较短长度的字符串替换字符串中存在的模式),或者循环终止由于在长度为0的字符串中找不到非空字符串,并且
myString.length()
是有限的,因此循环必须在myString.length()
(有限多次)迭代后明确终止(实际上我们可以得到更好的界限,但为了简单起见……)# 2 楼答案
不。但是如果
myString
是null
,if可能会抛出一个exception如果字符串不包含两个空格,它将在第一次迭代后
break;
。否则,它确实包含两个空格,并将其替换为一个空格,然后,它将不再有两个空格,它将break;
# 3 楼答案
不,这不能无限循环。在类似的情况下,需要注意的是
indexOf
只会搜索完全匹配的字符序列,而replaceAll
则使用正则表达式。Jon Skeet描述了一个让他大吃一惊的案例,因为他使用的两种方法(一种用于搜索,一种用于替换)对某些字符组合的处理方式不同(我认为这与Unicode组合字符有关,我不记得这么简单),最终导致了一个意外的无限循环。在这种情况下,似乎没有问题。我查看了文档,看看是否有任何方法可以将模式匹配标志潜入replaceAll
并导致其行为不同,但我认为没有不过,由于
replaceAll
需要正则表达式,所以不需要循环就可以完成同样的事情:或者
或者其他可能性
# 4 楼答案
不,不会的——但是循环的结构可以更好:
有时你需要打破一个循环,但如果你不需要它,你应该避免它
当然,更好的解决方案是根本不使用循环,记住replaceAll是从regex开始工作的:
例如:
在这里试试:http://www.tryjava8.com/app/snippets/52c19090e4b00bdc99e8a943
# 5 楼答案
如果字符串中没有双空格,则条件
将是真的,循环将中断
如果存在双空格,则条件为假。你继续排队
它将用一个字符串替换所有的双字符串。在下一个过程中,这意味着初始条件为真,循环将中断。一个有很多连续空格的字符串可能需要通过循环几次(每次
__
变成_
,但我不认为这是递归的,所以在循环的三次循环中,8->;4->;2->;1个空格)