![](/img/trans.png)
[英]Why won`t this simple function output anything if I don`t use a break statement?
[英]Will Java notice when a loop won't change anything, or should I use break statement?
我想確定String-List的某個元素是否具有其他String作為子字符串。 我的方法是
//...
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循環。
我會用一段時間而不是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
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.