Java 会注意到循环何时不会改变任何东西,还是我应该使用 break 语句?

Will Java notice when a loop won't change anything, or should I use break statement?

我想确定 String-List 的某个元素是否有其他字符串作为子字符串。我的方法类似于

//...
boolean found = false;
for (String elem : myList) {
    if (elem.contains(someString)) {
        found = true;
        break;  // <-- necessary?
    }
}
if (found) {
    // do something
}

我的问题是:break语句在这里有用吗?直觉上似乎省略它会导致不必要的工作,因为我只对找出字符串是否至少作为子字符串包含一次感兴趣。

然而,聪明的编译器会注意到,在 found 被设置为 true 之后,程序的状态就不能再改变了。 Java 编译器或 JVM 会识别这个吗?

你完全正确。 break 语句不会改变算法的语义(也不改变复杂性),但会避免在找到元素后做不必要的工作。

(JVM很可能不会发现found永远不会从true变为false并提前中断循环。 )

虽然我通常将这种类型的片段放在一个方法中,并使用 return 语句如下:

for (String elem : myList)
    if (elem.contains(someString))
        return true;
return false;

如果您碰巧使用 Java 8,还有更好的方法:

boolean found = myList.stream().anyMatch(s -> s.contains(someString));

不要指望编译器为您中断循环。

如果你希望避免 break 语句并且仍然不做不必要的工作,你可以这样重写循环:

boolean found = false;
for (int i = 0; i < myList.size() && !found; i++) {
    if (myList.get(i).contains(someString)) {
        found = true;
    }
}
if (found) {
    // do something
}

或者您可以使用 while 循环。

我会使用 while 而不是 for 循环:

//...
boolean found = false;
int i = 0;
while (i < myList.size() && !found) {
  String elem = myList.get(i)
    if (elem.contains(someString)) {
        found = true;
    }
    i++;
}
if (found) {
    // do something
}