簡體   English   中英

當循環不會改變任何內容時,Java是否會注意到?還是應該使用break語句?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM