是否有任何可分配给myString
变量的值会导致下面代码中出现无限循环?
while (true) {
if (myString.indexOf(" ") == -1) {
break;
}
myString = myString.replaceAll(" ", " ");
}
答案 0 :(得分:7)
此代码是否可能导致无限循环?
没有。但如果myString
为null
,可能会抛出exception。
如果String不包含两个空格,则在第一次迭代后它将break;
。否则,它确实包含两个空格,并用一个空格替换它,然后,它将不再有两个空格,并且它将break;
。
答案 1 :(得分:4)
不,它不会 - 但循环可以更好地结构化:
while (myString.indexOf(" ") != -1) {
myString = myString.replaceAll(" ", " ");
}
有时你需要在一个循环中断,但如果你不需要它,你应该避免它。
更好的解决方案当然是根本不使用循环,请记住replaceAll可以从正则表达式中运行:
myString = myString.replaceAll("[ ]+", " ");
例如:
String str = "this is a test string with long white space chunks";
System.out.println(str.replaceAll("[ ]+", " "));
在此处试试:http://www.tryjava8.com/app/snippets/52c19090e4b00bdc99e8a943
答案 2 :(得分:3)
如果字符串中没有双重空格,则为条件
if(myString.indexOf(" ") == -1)
将是真的,循环将会中断。
如果 是双空格,则条件为false。你继续行
myString = myString.replaceAll(" ", " ");
将用一个字符串替换所有双字符串。在下一遍中,这意味着初始条件为真,循环将中断。有很多连续空格的字符串可能需要通过循环几次(每次__
变成_
,但我不相信这是递归的,所以8 - > 4 - > 2 - > 1个空格,三次通过循环)。
答案 3 :(得分:2)
不,这不能无限循环。在类似的情况下,要注意的是indexOf
只搜索完全匹配的字符序列,而replaceAll
采用正则表达式。 Jon Skeet描述了一个让他绊倒的案例,因为他使用的两种方法(一种用于搜索,一种用于替换)以不同方式处理某些字符组合(我认为它与Unicode组合字符有关,我不记得随意),以及结果出现意外的无限循环。在这种情况下,似乎没有问题。我查看了文档,看看是否有任何方式可以将模式匹配标记潜入replaceAll
并使其表现不同,但我认为没有。
由于replaceAll
采用正则表达式,你可以在没有循环的情况下完成同样的事情:
myString.replaceAll(" {2,}", " ");
或
myString.replaceAll(" +", " ");
或其他可能性。
答案 4 :(得分:1)
不,这不可能发生。您可以通过字符串长度的归纳来证明这一点。
基本上归结为以下观察:
myString
在循环的每次迭代中变短(用字符串中较短的字符串替换字符串中存在的模式)或循环终止。
由于在长度为0的字符串中找不到非空字符串且myString.length()
是有限的,因此循环必须在myString.length()
(有限多次)迭代后明确终止(实际上我们可以得到)更好的约束,但为了简单起见......)。