有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

是否有任何值可以分配给myString变量,从而在下面的代码中产生无限循环

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

共 (5) 个答案

  1. # 1 楼答案

    不,这不可能发生。你可以通过对字符串长度的归纳来证明这一点

    基本上可以归结为以下观察结果:

    myString在循环的每次迭代中变短(用较短长度的字符串替换字符串中存在的模式),或者循环终止

    由于在长度为0的字符串中找不到非空字符串,并且myString.length()是有限的,因此循环必须在myString.length()(有限多次)迭代后明确终止(实际上我们可以得到更好的界限,但为了简单起见……)

  2. # 2 楼答案

    Could this code potentially result in an infinite loop?

    不。但是如果myStringnull,if可能会抛出一个exception

    如果字符串不包含两个空格,它将在第一次迭代后break;。否则,它确实包含两个空格,并将其替换为一个空格,然后,它将不再有两个空格,它将break;

  3. # 3 楼答案

    不,这不能无限循环。在类似的情况下,需要注意的是indexOf只会搜索完全匹配的字符序列,而replaceAll则使用正则表达式。Jon Skeet描述了一个让他大吃一惊的案例,因为他使用的两种方法(一种用于搜索,一种用于替换)对某些字符组合的处理方式不同(我认为这与Unicode组合字符有关,我不记得这么简单),最终导致了一个意外的无限循环。在这种情况下,似乎没有问题。我查看了文档,看看是否有任何方法可以将模式匹配标志潜入replaceAll并导致其行为不同,但我认为没有

    不过,由于replaceAll需要正则表达式,所以不需要循环就可以完成同样的事情:

    myString.replaceAll(" {2,}", " ");
    

    或者

    myString.replaceAll("  +", " ");
    

    或者其他可能性

  4. # 4 楼答案

    不,不会的——但是循环的结构可以更好:

    while (myString.indexOf("  ") != -1) {
        myString = myString.replaceAll("  ", " ");
    }
    

    有时你需要打破一个循环,但如果你不需要它,你应该避免它

    当然,更好的解决方案是根本不使用循环,记住replaceAll是从regex开始工作的:

    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

  5. # 5 楼答案

    如果字符串中没有双空格,则条件

    if(myString.indexOf("  ") == -1)
    

    将是真的,循环将中断

    如果存在双空格,则条件为假。你继续排队

    myString = myString.replaceAll("  ", " ");
    

    它将用一个字符串替换所有的双字符串。在下一个过程中,这意味着初始条件为真,循环将中断。一个有很多连续空格的字符串可能需要通过循环几次(每次__变成_,但我不认为这是递归的,所以在循环的三次循环中,8->;4->;2->;1个空格)