这段代码可能导致无限循环吗?

时间:2013-12-30 15:04:06

标签: java string infinite-loop

是否有任何可分配给myString变量的值会导致下面代码中出现无限循环?

while (true) {
    if (myString.indexOf("  ") == -1) {
        break;
    }
    myString = myString.replaceAll("  ", " ");
}

5 个答案:

答案 0 :(得分:7)

  

此代码是否可能导致无限循环?

没有。但如果myStringnull,可能会抛出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()(有限多次)迭代后明确终止(实际上我们可以得到)更好的约束,但为了简单起见......)。