使用flag或if子句更有效吗?

Pur*_*ari 7 java performance if-statement boolean

在Java循环中,使用boolean标志而不是if语句更有效吗?

看看这两行代码.

使用标志:

public boolean isSomethingForAnyone() {
    boolean flag = false;
    for (Item item : listOfItems) {
        flag = flag || item.isSomething();
    }
    return flag;
}
Run Code Online (Sandbox Code Playgroud)

使用if声明:

public boolean isSomethingForAnyone() {
    for (Item item : listOfItems) {
        if (item.isSomething())
            return true;
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

if如果在第一次迭代时isSomething()返回true,则使用该语句的方法当然会更快.但是,它的平均速度是否更快,或者分支是否足够慢以至于速度较慢?另外,如果循环更快,情况会有所不同吗?为了简单起见,我在这里使用了for-each循环,我认为这比使用计数器迭代数组要慢.

Jon*_*eet 4

这两段代码并不完全相同。

即使您只根据item.isSomething()需要调用多次(与我原来的答案相反),第一个版本仍然不断尝试迭代集合的其余部分。

Item.isSomething()想象一下修改了找到该项目的集合的实现(如果它返回true)。此时,第一段代码将抛出一个ConcurrentModificationException假设它是“常规”集合的信息 - 而第二段代码将仅返回true.

从根本上来说,第二段代码更高效:它只迭代确定答案所需的列表内容,而不是遍历所有内容。性能差异很可能是无关紧要的——特别是当集合很小时——但这取决于上下文。

您发现哪个更具可读性是另一回事 - 效率可能不会很重要,尽管这取决于上下文。就我个人而言,我发现第二个版本更具可读性并且更高效,因此我总是使用它。(嗯,我会在语句主体周围添加大括号if,但仅此而已。)