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
}
我想确定 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
}