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

Java循环中,使用布尔标志而不是if语句是否更有效?

看看这两行代码.

使用标志:

public boolean isSomethingForAnyone() {
    boolean flag = false;
    for (Item item : listofItems) {
        flag = flag || item.isSomething();
    }
    return flag;
}

使用if语句:

public boolean isSomethingForAnyone() {
    for (Item item : listofItems) {
        if (item.isSomething())
            return true;
    }
    return false;
}

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

解决方法

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

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

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

从根本上说,第二段代码更有效:它只迭代确定答案所需的列表,而不是通过所有内容.很可能是性能不同是无关紧要的 – 特别是如果集合很小 – 但这取决于上下文.

您发现更具可读性的是另一个问题 – 效率可能不会很大,尽管这取决于上下文.就个人而言,我发现第二个版本更具可读性和更高效,所以我总是使用它. (好吧,我会在if语句的主体周围添加大括号,但就是这样.)

相关文章

最近看了一下学习资料,感觉进制转换其实还是挺有意思的,尤...
/*HashSet 基本操作 * --set:元素是无序的,存入和取出顺序不...
/*list 基本操作 * * List a=new List(); * 增 * a.add(inde...
/* * 内部类 * */ 1 class OutClass{ 2 //定义外部类的成员变...
集合的操作Iterator、Collection、Set和HashSet关系Iterator...
接口中常量的修饰关键字:public,static,final(常量)函数...